0

私はネットワークアプリケーションを書いています。スレッドの競合状態に関していくつかの問題があります。

「cd」はソケット記述子です。私のスレッドの1つがソケット記述子を取得し、ソケットを介してデータを送信します。

map_sdが5を返すとします。ただし、別のスレッドがソケット5を閉じて、別のスレッドを再割り当てする場合があります。プログラムのロジックを破壊します。

                // wait until there is valid descriptor mapping
                while( !(cd = map_sd( sd )) ){
                    sleep(1);
                }                   

                // forward PAYLOAD header
                if( send(cd, &payload, sizeof(PAYLOAD), MSG_NOSIGNAL) < 0 ){    
                    printf("send fail 813\n");
                }

Linuxでpthreadライブラリを使用しているときに、上記のコードを「アトミック」にするにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

0

条件変数とミューテックスが必要です。

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

cdを渡すスレッドで:

pthread_mutex_lock(&lock);
/* here you pass cd through a data structure or whatever */
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);

cdを待っているスレッドで:

pthread_mutex_lock(&lock);
if (pthread_cond_wait(&cond, &lock) != 0) {
    /* handle error */
}
/* here you can acquire cd */
pthread_mutex_unlock(&lock);

条件変数とロックを使用して排他的アクセスを行い、リソースが使用可能になったことを他のスレッドに通知します。pthread_cond_wait()ロックを解放して待機し、他のスレッドから。で通知されると、ロックを再取得しpthread_cond_signal()ます。

編集:フォーマット。

于 2013-02-01T20:00:33.020 に答える