应用信号量后,代码仍然无法正常工作

时间:2012-10-28 03:22:41

标签: c semaphore

以下代码应输出NITER * 2,但似乎仍然没有互斥锁工作,任何想法?

为什么clang给了我以下警告:

semaphore-example-add-semaphore.c:24:1: warning: control reaches end of non-void
      function [-Wreturn-type]
}
^
1 warning generated.

代码:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>

#define NITER 1000000

int count = 0;

sem_t mutex;


void * ThreadAdd(void * a)
{
    int i, tmp;
    for(i = 0; i < NITER; i++)
    {
        sem_wait(&mutex);
        tmp = count;
        tmp = tmp + 1;
        count = tmp;
        sem_post(&mutex);
    }
}

int main(int argc, char * argv[])
{
    pthread_t tid1, tid2;
    sem_init(&mutex, 0, 1);
    if(pthread_create(&tid1, NULL, ThreadAdd, NULL))
    {
        printf("\n ERROR create thread 1");
        exit(1);
    }
    if(pthread_create(&tid2, NULL, ThreadAdd, NULL))
    {
        printf("\n ERROR create thread 2");
        exit(1);
    }
    if(pthread_join(tid1, NULL))
    {
        printf("\n error joining thread");
        exit(1);
    }
    if(pthread_join(tid2, NULL))
    {
        printf("\n ERROR joining thread");
        exit(1);
    }
    if(count < 2 * NITER)
        printf("\n BOOM! count is [%d], should be %d\n", count, 2 * NITER);
    else
        printf("\n OK! count is [%d]\n", count);
    pthread_exit(NULL);
}

1 个答案:

答案 0 :(得分:1)

clang错误是因为ThreadAdd声明为void *并且不返回任何内容。只需返回0.

一个问题是sem_wait和sem_post可能会失败。在这种情况下,它们返回-1,您需要检查errno的原因。您的代码看起来没问题,所以我在两台机器上试了一下:     - SE Linux,工作得很好     - Mac,sem_wait失败。
所以直接的问题是你没有检查返回值。

我发现另一篇文章声称OS X上不支持sem_init(是的Apple)但是支持sem_open。我使用sem_open尝试了你的代码并且它有效。我能看到的文档中没有任何内容可以提供任何暗示。我链接到另一个帖子,但我在机器更换中丢失了地址......

我看到杰克也发布了这个......