2012-10-28 37 views
0

下面的代码应该输出NITER * 2,但它似乎仍然没有互斥工作,任何想法?应用信号后,代码仍然不能正常工作

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

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

-Wreturn型:你ThreadAdd函数返回“无效*”不“无效”。所以你需要返回NULL,如果你不需要返回一个值到主函数。 – goji

+0

另外,如果你想要互斥功能,你为什么要使用信号量?改用pthread的互斥体。 – goji

+0

此外,此代码似乎输出正确的值:OK!计数是[2000000] – goji

回答

1

铛错误是因为ThreadAdd被声明为void *,不返回任何东西。只返回0.

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

我发现另一篇文章说sem_init不支持OS X(是苹果),但支持sem_open。我使用sem_open尝试了你的代码,它工作。我能看到的文档中没有任何提示是这种情况。我会链接到其他职位,但我失去了在一台机器改变地址...

看到杰克还张贴此...