OS X上的Pthread和gcc编译问题

时间:2012-01-19 03:51:01

标签: c macos gcc compiler-errors pthreads

我有一个可以在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 个答案:

答案 0 :(得分:13)

根据opengroup.org上的info about pthread_barriers,在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年的苹果主列表中There is a letter,表示Mac OS X中没有障碍。

我知道Solaris也有一些pthread_barrier问题。

答案 1 :(得分:2)

就像提到的osgx一样,OS X上没有实现障碍,但您可以随时实现它,或者只使用this实现。关于上一个实现的快速说明,您可以使用osgx提到的宏_POSIX_BARRIERS,而不是博客上的那些,如#if !_POSIX_BARRIERS