我想知道在Linux中使用pthread时,多个线程共享同一个句柄是否会有潜在的风险?我刚刚尝试了以下简单的代码:使用pthread_create
创建两个线程,并为它们分配相同的pthread_t
句柄,然后让它们运行。输出似乎两个线程都正常运行,尽管我认为这肯定不是正确的方法,所以它会有什么潜在的风险?谢谢
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
static void *thread_1(void *arg){
while(1){
sleep(1);
printf("threading 1...\n");
}
}
static void *thread_2(void *arg){
while(1){
sleep(2);
printf("threading 2...\n");
}
}
int main()
{
pthread_t handler;
pthread_create(&handler, NULL, thread_1, NULL);
pthread_create(&handler, NULL, thread_2, NULL);
(void) pthread_join(handler, NULL);
return 0;
}
我已经尝试编译并运行测试代码,似乎没有可见的错误
2条答案
按热度按时间j2qf4p5b1#
我猜您担心的是
pthread_t
是一个不透明类型,它实际上可能存储了关于线程的有价值的信息,因此您不能对两个线程使用同一个类型。在Linux(您标记的)上,它只是一个
unsigned long
:因此,我认为除了ID之外,类型中没有“存储”任何内容。因此,除了丢失第一个线程的ID之外,您正在做的事情是安全的。
你没有两个线程共享一个句柄。你有一个变量来存储第二个线程的ID。第一个线程有一个不同的ID,你把它扔掉了。
6rqinv9w2#
在你的代码中,
handler
被第二个pthread_create
函数调用覆盖,因此main
正在等待第二个线程的终止。由于
thread_1
和thread_2
都是无限循环,代码将不会到达pthread_join
函数调用,因此没有可见变化。如果您删除第二个线程中的无限循环,您会注意到进程终止。