POSIX信号量:同步问题

时间:2011-06-03 17:49:02

标签: c synchronization posix semaphore

我在使用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_initsem_getvalue的所有调用(两者都不在MacOS下),使用sem_open初始化信号量,它似乎正常工作。
然而,我发现了一个奇怪的问题,可能是因为我对sem_open调用的误解:每次重新启动程序时,如果我为信号量重用相同的名称,我会收到错误File exists。如何强制重用相同的标识符?

除了。根据手册页,如果成功,sem_wait应返回0,否则返回-1。如果我收到1(这种情况总是发生在test2)是什么意思?

1 个答案:

答案 0 :(得分:1)

如果你想要两个函数交替使用,你应该只使用一个信号量。

当你的一个线程被调度时,例如t1,它会锁定sem1然后保留它并在while循环中运行直到它被中断。因为它没有执行sem_post(& sem1),所以它不会控制其他线程。


更新:再看一遍,这段代码应该可行。我认为未在OSX上实现的sem_init可能是您的问题。


更新:要回答关于sem_wait返回1的问题,看起来在errno中返回了真正的错误值。如果返回值!= 0,那么检查那里。我在黑暗猜测中的镜头将是你所看到的EINTR。