【发布时间】:2015-05-07 09:19:46
【问题描述】:
我正在学习线程编程。在执行以下示例时,我得到了未定义的行为。
static void* print_thread_attr (void* param)
{
pthread_attr_t attr;
int detach_state = PTHREAD_CREATE_JOINABLE;
pthread_getattr_np (pthread_self(), &attr);
pthread_attr_getdetachstate (&attr, &detach_state);
pthread_attr_destroy (&attr);
printf("Detach state of thread [%u] pid [%d] is %s\n", pthread_self(), getpid(),
(PTHREAD_CREATE_JOINABLE == detach_state)?
"JOINABLE THREAD":"DETACHED THREAD");
return NULL;
}
void test_thread_attributes ()
{
pthread_t thread_id1;
pthread_t thread_id2;
pthread_attr_t attr;
printf("main pid [%d]\n", getpid());
pthread_attr_init (&attr);
pthread_create (&thread_id1, &attr, print_thread_attr, NULL);
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&thread_id2, &attr, print_thread_attr, NULL);
pthread_attr_destroy (&attr);
pthread_join (thread_id1, NULL);
//sleep (1);
}
1.有时会打印:
main pid [3394]
Detach state of thread [88292160] pid [3394] is DETACHED THREAD
Detach state of thread [75705152] pid [3394] is JOINABLE THREAD
-
但有时
main pid [3403] Detach state of thread [75705152] pid [3403] is JOINABLE THREAD Detach state of thread [88292160] pid [3403] is DETACHED THREAD Detach state of thread [88292160] pid [3403] is DETACHED THREAD
这很奇怪,因为我只使用了 2 次 pthread_create,但第 2 种情况打印了 3 次。使用 valgrind 检查时,第一种情况没有内存泄漏,但第二种情况,“可能丢失:1 个块中的 136 个字节”
我需要知道为什么在第二种情况下,线程 88292160 会打印两次? 此外,您可能会注意到注释掉的 sleep (1)。当我睡觉 (1) 时,我没有观察到第二种情况发生。
【问题讨论】:
-
请注意,在第二种情况下,最后两条消息的第二个线程 ID 是相同的,所以不,实际上没有更多线程被执行,只有 2 个。
-
如果
main()没有提前结束,你是否也观察到这一点?如果没有,请尝试通过调用pthread_exit()离开main()。 -
可能与以下内容重复:stackoverflow.com/q/26211423/694576
标签: c linux multithreading pthreads