アップデート3
最近、私のコードがランダムにセグメンテーション違反エラーを引き起こすことに気づきました。しかし、私のコードはこれまでのところ非常に単純であり、そのエラーがどこから来ているのか理解できません。ランダムに発生するため、何らかの競合状態があると思います。これが関連する可能性のあるすべてのコードだと思います。さらに必要な場合は教えてください。
namespace thread {
pthread_t terminated_thread_id, /* and others */;
pthread_mutex_t terminate_thread = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t terminate_thread_signal = PTHREAD_COND_INITIALIZER;
int total_thread_count = 0;
int termination; // + sembufs
inline void* Exit(void* value) {
// This must be unlocked after all join-related jobs are done
semop(thread::termination, thread::termination_in_process, 2)
pthread_mutex_lock(&thread::terminate_thread);
thread::terminated_thread_id = pthread_self();
pthread_cond_signal(&thread::terminate_thread_signal);
pthread_mutex_unlock(&thread::terminate_thread);
pthread_exit(value);
return value;
}
}
int main(int argc, const char** argv){
...
pthread_mutex_lock(&thread::terminate_thread);
if(0 != pthread_create(&thread::communication_handler_thread_id, NULL, \
CommunicationHandler, NULL)){
global::PrintDebug("pthread_create() failed", __FILE__, __LINE__);
}
/** 2 more pthread_create()-calls */
do{
thread::terminated_thread_id = pthread_self();
pthread_cond_wait(&thread::terminate_thread_signal, \
&thread::terminate_thread);
if(!pthread_equal(thread::terminated_thread_id, pthread_self())){
pthread_join(thread::terminated_thread_id, NULL);
...
semop(thread::termination, thread::termination_done, 1)
}
}while(thread::total_thread_count > 0);
pthread_mutex_unlock(&thread::terminate_thread);
return 0;
}
シグナルterminate_thread_signalは、thread :: Exit()関数でのみ発行されます。この関数は、スレッドの作成に使用される関数の最後でのみ呼び出されます。
これは、デバッガーがコールスタックに対して表示するものです。
#0 ( 0xb7fe2424 in __kernel_vsyscall() (??:??)
#1 0xb7fbdfcf __pthread_cond_wait(cond=0x80539c0, mutex=0x8053998) (pthread_cond_wait.c:153)
#2 0x804a094 main(argc=1, argv=0xbffff9c4) (/home/papergay/SeekYourCar/0.2/Server/main.cpp:121)
私がすでに知っているのは、エラーが発生した場合、thread :: Exit()を呼び出したスレッドはまだないということです。また、いくつかの初期化を伴う名前のない名前空間を使用しています(それが関連している可能性がある場合)。IDEとしてCode::Blocksを使用し、コンパイラーとしてGCCを使用しています。