程序示例:
。。。
头文件和其他函数及全局变量
int main(int argc, char** argv)
{
int i=0;
if(argc == 2)
i = atoi(argv[1]);
getseg(&g_data);
pthread_mutexattr_t mutex_shared_attr;
/* Set pthread_mutex_attr to process shared */
pthread_mutexattr_init(&mutex_shared_attr);
pthread_mutexattr_setpshared(&mutex_shared_attr, PTHREAD_PROCESS_SHARED);
pthread_mutexattr_setrobust_np(&mutex_shared_attr, PTHREAD_MUTEX_ROBUST_NP);
pthread_mutex_init(&g_data->sum_mutex, &mutex_shared_attr);
process_fn(i);
printf("%u in the end, the shared sum: %d\n",getpid(), g_data->counter);
return 0;
}
[root@Cross-Main threading]# gcc shm_lock.c -o shm_lock -lpthread
shm_lock.c: In function ‘main’:
shm_lock.c:93: error: ‘PTHREAD_MUTEX_ROBUST_NP’ undeclared (first use in this function)
shm_lock.c:93: error: (Each undeclared identifier is reported only once
shm_lock.c:93: error: for each function it appears in.)
编译时出现PTHREAD_MUTEX_ROBUST_NP未定义的问题
在pthread.h中发现
#ifdef __USE_GNU
/* Robust mutex or not flags. */
enum
{
PTHREAD_MUTEX_STALLED_NP,
PTHREAD_MUTEX_ROBUST_NP
};
#endif
修改编译选项依然编译不过
[root@Cross-Main threading]# gcc shm_lock.c -o shm_lock -lpthread -D__USE_GNU
shm_lock.c: In function ‘main’:
shm_lock.c:93: error: ‘PTHREAD_MUTEX_ROBUST_NP’ undeclared (first use in this function)
shm_lock.c:93: error: (Each undeclared identifier is reported only once
shm_lock.c:93: error: for each function it appears in.)
百度一下查到解决方案:
This is wrong, __USE_GNU is glibc internal macro that shouldn't be ever defined by apps. The way to select GNU feature set in glibc headers is to define _GNU_SOURCE, either before including first include header in the source .c/.C file, or by defining it on the command line (-D_GNU_SOURCE).
[root@Cross-Main threading]# gcc shm_lock.c -o shm_lock -lpthread -D_GNU_SOURCE
[root@Cross-Main threading]#