関連するスレッド ID に関連付けられた pthread_create メソッド (この pthread を配置する場所が必要) によって作成された pthread を保持するためのマップがプログラムに含まれています。
pthread の関数の最後のコマンドでマップから pthread を消去するという問題はありますか?
4 に答える
あなたが言ったように、あなたはスレッドIDを保持しています。それはただの数字です。これ以上何もない。
要素 (数値) を消去しても、プログラムに害はありません。
編集:ただし、要素の消去std::map
が同期されていることを確認する必要があります。STL コンテナーはスレッドセーフではないことを忘れないでください。詳細については、この質問を参照してください。
Edit2:同期に問題がないことを確認するには、次の手順を実行します。
pthread_mutex_t mut; //global variable
pthread_mutex_init(&mut,0); //initialize mutex before calling pthread_create()
//and use mutex to prevent synchronization problems in the end of .
pthread_mutex_lock(&mut);
my_map.erase(key);
pthread_mutex_unlock(&mut);
Ashot Martirosyan の回答に同意します。もう一点だけ付け加えておきたい。
スレッドが結合可能として作成されている場合、アプリケーションはpthread_join()
;を呼び出す必要があります。そうしないと、メモリリークが発生します。マップがスレッド ID を記録する唯一の場所である場合、各スレッドが終了する直前にマップからスレッド ID を削除すると、スレッドに参加できなくなります。
いつでもデータを消去できます。ただし、スレッドがこのマップにアクセスする場合、プログラムに競合状態が発生する可能性があります。スレッドAが終了しているが、データを消去する前にスワップアウトされた場合、スレッドBはスレッドAのデータを確認し、スレッドAがまだ実行可能なスレッドであると見なす可能性があります。
pthread_join
または またはpthread_detach
または 切り離されたスレッドを作成する必要があります。そうしないと、いつかエラーが発生しますpthread_create
。結合可能なすべてのスレッドに対して、OS はスレッドの戻り値を格納するためにある程度のメモリを予約します。このような目的で予約されるメモリの総量は限られており、予想よりも少なくなる可能性があるため、参加しないすべてのスレッドを切り離してください。