1

一意の ID を返す関数を呼び出す必要があり、

int getid()
{
static id=0;
id++;
return id;

}

複数のスレッドがこの関数を呼び出す必要があります。私の問題は、ミューテックスをロックする必要がある場所がわからないことです。

以下のように関数を呼び出す前後にロックする必要がありますか

  pthread_mutex_lock( &id );
  int id = getid()
  pthread_mutex_unlock( &id );

誰かが私を助けてくれますか?

4

2 に答える 2

3

共有状態にアクセスする前であれば、どこでロックされたかは問題ではありません。ミューテックスのロックが関数内にあると、エラーが発生しにくくなります。このような最小限のものはうまくいきます:

int getid()
{
static int id=0;

pthread_mutex_lock( &mutex );
int newId = ++id;
pthread_mutex_unlock( &mutex );

return newId; 
}

スタティック変数の初期化がスレッド セーフであることに関して、調査が必要な問題がいくつかあります。

于 2012-11-18T01:47:18.680 に答える
2

For a single integer you don't need a full mutex, atomic increment would be enough:

int getid() {
    static int id = 0;
    return __sync_fetch_and_add( &id, 1 );
}
于 2012-11-18T01:56:44.233 に答える