信号量被定义为静态变量
static int semaphore = -1;
我想发布到这个信号量
sem_post(&semaphore);
在以这种方式创建的线程中等待信号量:
pthread_create(&tid, NULL, start, NULL);
和
static void *start(void *context)
{
// ...
sem_init(&semaphore, 0, 0);
sem_wait(&semaphore);
// ...
return NULL;
}
不知何故等待信号量不受信号量的影响。如果我从开始例程发布信号量,一切都还可以。
有什么问题?
答案 0 :(得分:4)
传递int*
而不是sem_t*
作为sem_xxx
函数的第一个参数可以访问已分配区域的内存。根据至少一个source of <semaphore.h>
,sem_t
的大小为16到32个字节; int
不足以保存信号量的结构,可能导致未定义的行为。
您需要更改
static int semaphore = -1;
到
static sem_t semaphore;
修复超出分配的内存区域的访问。
此外,在启动使用它们的线程之前初始化信号量通常是个好主意。您应该将初始化调用从start()
函数移动到main()
,或者用于启动线程的任何函数。
sem_init(&semaphore, 0, 0);