Проблема с компиляцией Pthread и gcc в OS X

У меня есть скрипт, который отлично компилируется в Linux (Ubuntu 11.04), но не в OS X (Lion).

gcc -pthread -o hw1 hw1.c 
hw1.c:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘barr’
hw1.c: In function ‘__syncthreads’:
hw1.c:53: error: ‘barr’ undeclared (first use in this function)
hw1.c:53: error: (Each undeclared identifier is reported only once
hw1.c:53: error: for each function it appears in.)
hw1.c:54: error: ‘PTHREAD_BARRIER_SERIAL_THREAD’ undeclared (first use in this function)
hw1.c: In function ‘parallel_psum’:
hw1.c:94: error: ‘barr’ undeclared (first use in this function)
hw1.c:107: warning: assignment from incompatible pointer type

Вот первые 22 строки кода:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <sys/time.h>
#include <pthread.h>
#include <assert.h>

/* create thread argument struct for thr_func() */
typedef struct _thread_data_t {
    int tid;
    int* ints;
    int* sums;
    int num_ints;
    int* temp;
} thread_data_t;

const int MIN_RAND_INT = 1;
const int MAX_RAND_INT = 65000;

// pthreads barrier variable
pthread_barrier_t barr;

Есть идеи, почему это происходит?


person Dolan Antenucci    schedule 19.01.2012    source источник
comment
Кажется, что pthread_barrier_t не определен.   -  person asaelr    schedule 19.01.2012
comment
Насколько я понимаю, это тип, определенный библиотекой pthread.   -  person Dolan Antenucci    schedule 19.01.2012
comment
OSX может не иметь pthred_barrier_t. Некоторый намек на это был упомянут в этот вопрос   -  person another.anon.coward    schedule 19.01.2012
comment
Что ж, это проясняет это. Linux за победу :) спасибо   -  person Dolan Antenucci    schedule 19.01.2012
comment
Да, OS X кажется чем-то вроде POSIX, замороженного примерно в 2001 году. Похоже, помощь людям в написании кода, совместимого с современными стандартами, не является их первой целью.   -  person Jens Gustedt    schedule 19.01.2012


Ответы (2)


Согласно информации о pthread_barriers на opengroup.org, барьеры определяются в необязательных< /em> часть стандарта POSIX; название опции "(РАСШИРЕННЫЕ ПОТОКИ РЕАЛЬНОГО ВРЕМЕНИ)", иногда более точно называемое "BAR, барьеры (в реальном времени)".

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap02.html

Система может поддерживать одну или несколько опций (см. Опции), обозначаемых следующими символическими константами:

_POSIX_BARRIERS

Таким образом, только если макрос _POSIX_BARRIERS определен как положительное число, вы можете использовать pthread_barrier_t или pthread_barrier_wait.

Mac OS X совместима с POSIX, но полный список реализованных опций недоступен в Интернете. Есть письмо в основном списке Apple от 2006 года, в котором говорится, что нет барьеры в Mac OS X.

Я знаю, что у Solaris тоже были проблемы с pthread_barrier.

person osgx    schedule 28.01.2012

Как упоминалось в osgx, барьеры не реализованы в OS X, но вы всегда можете реализовать их или просто использовать эта реализация. Краткое примечание к предыдущей реализации: вы можете использовать макрос, упомянутый в osgx, _POSIX_BARRIERS, вместо макроса в блоге, например, #if !defined _POSIX_BARRIERS || _POSIX_BARRIERS < 0

person Ricardo Freitas    schedule 04.04.2012