Pthread и проблема компиляции gcc на OS X - PullRequest
4 голосов
/ 19 января 2012

У меня есть скрипт, который прекрасно компилируется в 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;

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

Ответы [ 2 ]

13 голосов
/ 28 января 2012

Согласно информации о pthread_barriers на opengroup.org, барьеры определены в необязательной части стандарта POSIX;название опции: « (ADVANCED REALTIME THREADS) », иногда более точное название «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, но полный список реализованных опций недоступен онлайн. В списке поставщиков яблок с 2006 года есть буква , в которой говорится, что в Mac OS X нет никаких препятствий.

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

2 голосов
/ 04 апреля 2012

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

...