【发布时间】:2012-08-05 12:09:36
【问题描述】:
更新 3
最近,我注意到我的代码随机导致 Segmentation Fault 错误。但我认为到目前为止我的代码非常简单,我无法弄清楚该错误来自哪里。由于它是随机发生的,我假设存在某种竞争条件。我认为这是所有可能相关的代码,如果您需要更多,请告诉我:
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()。 我还使用了一个未命名的命名空间和一些初始化(如果可能相关的话)。 我使用 Code::Blocks 作为 IDE,使用 GCC 作为编译器。
【问题讨论】:
-
我根本没有读过你的代码,但请记住,MinGW 做了一些神奇而美妙的事情。例如,您的应用程序可能不会在分段错误时崩溃,但下次调用
free时。我假设这发生在pthread_cond_wait。您确定程序中的其他任何地方都没有分段错误/未初始化的内存吗? -
从
1开始你的线程数,然后用0测试它在我看来是假的。另外你的pthread_exit没用,return做得很好。 -
好的,睡了一会儿后,我查看了线程并部分调整了我的代码。我还尝试了你的建议@Zeta。下次调用
free()时,它似乎不会崩溃 - 如果您正在谈论语义上正确的函数调用。崩溃点保持不变。 -
除了简单地使用调试器之外,还有其他方法可以找到我的错误吗?