方案如下:
问题出在这里,取决于机器和编译标志,输出表示例如线程A被取消但线程B开始了。我在具有不同编译器的不同计算机上尝试了它,具有不同的istallations。
奇怪的是,我使用gcc -Wall -Werror -ansi -pedantic -D_POSIX_C_SOURCE=200809L -pthread -lrt
进行编译,第二个死锁出现问题,但是当我删除-Wall和-Werror时,问题就出现了3.死锁0o
我上传了来源here。编译标志在源头,我尝试了gcc和clang。
我也尝试过Ubuntu 13.04和Arch。
Here是输出,我用“ - >”
我忘记了什么,所以出现这种效果?我不认为某些库中存在错误。
答案 0 :(得分:1)
问题是您将局部变量的地址传递给线程。并且当线程启动并且您正在取消引用使用来保存局部变量但现在拥有其他内容的地址位置时,此局部变量可能不再存在。
由于它位于程序的堆栈空间中,因此您不会遇到段错误。
以下是代码问题领域及其产生方式的重点:
void resolve_deadlock()
{
void *pthread_exit_state;
int id_a = THREAD_A;
int id_b = THREAD_B;
<some code to detect deadlocks and kill a thread>
/* restart the killed thread */
if (pthread_create(&threads[THREAD_B], NULL, &thread_function, (void *) &id_b) != 0) {
perror("Create THREAD_B\n");
exit(EXIT_FAILURE);
}
}
所以程序运行并且: