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

时间:2013-04-22 16:34:51

标签: c linux pthreads

信号量被定义为静态变量

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;
}

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

有什么问题?

1 个答案:

答案 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);