macos OS X 上的 Pthread 和 gcc 编译问题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8920803/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Pthread and gcc compiling issue on OS X
提问by Dolan Antenucci
I have a script that compiles fine on Linux (Ubuntu 11.04), but not on OS X (Lion).
我有一个在 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
Here's the first 22 lines of the code:
这是代码的前 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;
Any ideas why this is happening?
任何想法为什么会发生这种情况?
回答by osgx
According to info about pthread_barrierson opengroup.org, barriers are defined in the optionalpart of POSIX standard; the name of option is "(ADVANCED REALTIME THREADS)", sometimes more exact referred as "BAR, barriers (real-time)".
根据opengroup.org 上关于 pthread_barriers 的信息,在POSIX 标准的可选部分中定义了屏障;选项的名称是“ (ADVANCED REALTIME THREADS)”,有时更准确地称为“BAR,barrier(实时)”。
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap02.html
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap02.html
The system may support one or more options (see Options) denoted by the following symbolic constants:
系统可能支持由以下符号常量表示的一个或多个选项(请参阅选项):
_POSIX_BARRIERS
So, only if the _POSIX_BARRIERS macro is defined as positive number, you can use pthread_barrier_t or pthread_barrier_wait.
因此,仅当 _POSIX_BARRIERS 宏定义为正数时,才可以使用 pthread_barrier_t 或 pthread_barrier_wait。
Mac OS X is POSIX Compliant, but full list of implemented options is not available online. There is a letterin apple mainling list from 2006, which says there is no barriers in Mac OS X.
Mac OS X 符合 POSIX 标准,但无法在线获取已实现选项的完整列表。2006年苹果主力榜上有一封信,说Mac OS X没有障碍。
I know that Solaris had some problems with pthread_barrier too.
我知道 Solaris 在 pthread_barrier 上也有一些问题。
回答by Ricardo Freitas
Just like osgx mentioned, barriers are not implemented on OS X, but you can always implement it or just use thisimplementation. Quick note on the previous implementation, you can use the macro that osgx mentioned, _POSIX_BARRIERS, instead of the ones on the blog, like this #if !defined _POSIX_BARRIERS || _POSIX_BARRIERS < 0
就像 osgx 提到的,屏障没有在 OS X 上实现,但你总是可以实现它或者只是使用这个实现。快速说明之前的实现,你可以使用osgx提到的宏_POSIX_BARRIERS,而不是博客上的宏,像这样#if !defined _POSIX_BARRIERS || _POSIX_BARRIERS < 0