0

次のコードは 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);
}
4

1 に答える 1

1

clang エラーは、ThreadAdd が void * として宣言されており、何も返さないためです。0 を返すだけです。

1 つの問題は、sem_wait と sem_post が失敗する可能性があることです。その場合、-1 が返されるため、errno で原因を確認する必要があります。あなたのコードは私には問題ないように見えたので、2 台のマシンで試してみました。
したがって、直接的な問題は、戻り値をチェックしていないことです。

sem_init は OS X (Apple) ではサポートされていませんが、sem_open はサポートされているという別の投稿を見つけました。sem_open を使用してコードを試してみましたが、うまくいきました。私が見ることができるドキュメントには、これが事実であるというヒントはありませんでした。別の投稿にリンクしたいのですが、マシンの変更でアドレスを失いました...

ジャックもこれを投稿しているのを見ました...

于 2012-10-28T04:11:24.177 に答える