[英]After applying semaphore, the code still doesn't work as expected
以下代码应输出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);
}
铛错误是因为ThreadAdd被声明为void *并且不返回任何内容。 只需返回0。
一个问题是sem_wait和sem_post可能失败。 在这种情况下,它们将返回-1,并且您需要检查errno以查找原因。 您的代码对我来说还不错,所以我在两台计算机上进行了尝试:-SE Linux,工作正常-Mac,sem_wait失败。
因此,直接的问题是您没有检查返回值。
我发现另一篇文章指出OS X(是的,Apple)不支持sem_init,但支持sem_open。 我使用sem_open尝试了您的代码,它起作用了。 我所看到的文档中没有任何迹象表明情况确实如此。 我会链接到另一篇文章,但是我在换机时丢失了地址...
我看到杰克也发布了这个...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.