我在使用Posix信号量进行同步时遇到了问题。这是我写的代码:
sem_t *sem1, *sem2;
void* test1() {
int rv;
while(1) {
rv = sem_wait(sem1);
printf("sem_wait(&sem1) = %d\n",rv);
printf("test1\n");
rv = sem_post(sem2);
printf("sem_post(&sem2) = %d\n\n",rv);
}
return NULL;
}
void* test2() {
while(1) {
rv = sem_wait(sem2);
printf("sem_wait(&sem2) = %d\n",rv);
printf("test2\n");
rv = sem_post(sem1);
printf("sem_post(&sem1) = %d\n\n",rv);
}
return NULL;
}
int main (int argc, const char * argv[]) {
pthread_t t1,t2;
sem1 = sem_open("sem1", O_CREAT | O_EXCL, 0644, 1);
if (sem1 == SEM_FAILED){
perror("sem1_init");
sem_close(sem1);
return;
}
sem2 = sem_open("sem2", O_CREAT | O_EXCL, 0644, 0);
if (sem2 == SEM_FAILED){
perror("sem2_init");
sem_close(sem1);
sem_close(sem2);
return;
}
pthread_create(&t1, NULL, &test1, NULL);
pthread_create(&t2, NULL, &test2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
我原以为,由于我将
sem1
初始化为1,将sem2
初始化为0,test1
将是第一个运行的函数,然后它们会交替进行直到时间结束。但实际上这并没有发生。在日志中,我看到了很多次“test1”,很多次“test2”,有一段时间是交替进行的,然后又变得毫无秩序。 请问我的错误出在哪里?
ps. 不知道是否有用,但我正在运行MacOSX 10.6.7
编辑:
我更新了代码,删除了对sem_init
和sem_getvalue
(在MacOS下都不存在)的所有调用,使用sem_open
来初始化信号量,似乎可以工作。
然而,我发现一个奇怪的问题,可能是因为我对sem_open
调用的误解:每次重新启动程序时,如果我重复使用相同的名称来指定信号量,则会收到错误“文件已存在”。我如何强制重用相同的标识符?
此外,根据人手册,sem_wait
如果成功应返回0,如果失败则返回-1。如果我在test2
中收到1,这是什么意思?
sem_init
和sem_getvalue
... 我本来期望至少会有一个警告,但实际上我甚至还收到了代码补全提示... 无论如何,我已经编辑了原帖并进行了一些更正。不确定这是否是问题的真正解决方案,但它似乎可以工作。请检查一下,看看是否有人知道我在帖子末尾添加的问题的答案。 - ManlioO_EXCL
,那么它将打开具有不确定起始值的现有信号量对象。 - Adam Rosenfieldsem_unlink
来完全删除信号量。 如果您的程序仅由诸如Ctrl-C(SIGINT)之类的信号终止,则需要使用signal(2)
或sigaction(2)
设置信号处理程序,该处理程序将在退出之前调用sem_unlink
。 - Adam Rosenfield