为什么信号量不受来自不同线程的post的影响?

信号量被定义为静态variables

static int semaphore = -1; 

我正试图发布到这个信号量

 sem_post(&semaphore); 

这样创build的线程中有一个等待信号量:

 pthread_create(&tid, NULL, start, NULL); 

 static void *start(void *context) { // ... sem_init(&semaphore, 0, 0); sem_wait(&semaphore); // ... return NULL; } 

不知何故等待信号量不受信号量的影响。 如果我从开始例程发布信号量,一切正常。

问题是什么?

传递int*而不是sem_t*作为sem_xxx函数的第一个参数可以访问分配区域之后的内存。 根据<semaphore.h>至少一个来源 , sem_t的大小是16到32个字节; int不足以保持信号量的结构,可能导致未定义的行为。

你需要改变

 static int semaphore = -1; 

 static sem_t semaphore; 

修复通过分配的内存区域的访问。

此外, 开始使用它们的线程之前 ,初始化信号量通常是一个好主意。 您应该将start()函数的初始化调用移动到main() ,或者您用来启动线程的任何函数。

 sem_init(&semaphore, 0, 0);