C语言 Linux中多个线程共享同一句柄的潜在风险

xqnpmsa8  于 2023-03-17  发布在  Linux
关注(0)|答案(2)|浏览(148)

我想知道在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;
}

我已经尝试编译并运行测试代码,似乎没有可见的错误

j2qf4p5b

j2qf4p5b1#

我猜您担心的是pthread_t是一个不透明类型,它实际上可能存储了关于线程的有价值的信息,因此您不能对两个线程使用同一个类型。
在Linux(您标记的)上,它只是一个unsigned long

typedef unsigned long int pthread_t;

因此,我认为除了ID之外,类型中没有“存储”任何内容。因此,除了丢失第一个线程的ID之外,您正在做的事情是安全的。
你没有两个线程共享一个句柄。你有一个变量来存储第二个线程的ID。第一个线程有一个不同的ID,你把它扔掉了。

6rqinv9w

6rqinv9w2#

在你的代码中,handler被第二个pthread_create函数调用覆盖,因此main正在等待第二个线程的终止。
由于thread_1thread_2都是无限循环,代码将不会到达pthread_join函数调用,因此没有可见变化。
如果您删除第二个线程中的无限循环,您会注意到进程终止。

相关问题