2

信号量被定义为静态变量

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

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

问题是什么?

4

1 回答 1

4

传递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);
于 2013-04-22T16:45:00.677 回答