线程在加入之前退出

问题描述 投票:0回答:2

请原谅我刚刚开始了解多线程的概念,我只是想知道为什么我的线程可能在加入之前就退出了。本质上,我维护一个进程 ID 的全局列表,我通过调用

迭代创建它们
   if(pthread_create(&thread_id[i], NULL, function_to_execute, NULL)) {
        fprintf(stderr, "error thread not created\n"); 
    }

现在的问题是,我的所有线程在到达我的 pthread join 之前就退出了

pthread_join(thread_id[i], NULL);

深度嵌套在函数调用中,在创建线程后直接调用该函数。我不确定是否应该执行一些锁定或其他操作,或者添加一个附加命令以确保线程在退出之前等待 join 语句。

c multithreading thread-safety pthreads thread-synchronization
2个回答
2
投票

来自 POSIX 文档:

pthread_join() 函数应暂停调用的执行 线程直到目标线程终止,除非目标线程 已经终止了。从成功的 pthread_join() 返回时 使用非 NULL value_ptr 参数调用,该值传递给 终止线程的 pthread_exit() 应在以下位置可用 value_ptr 引用的位置。当 pthread_join() 返回时 成功,目标线程已终止。结果 多次同时调用 pthread_join() 并指定相同的内容 目标线程未定义。如果调用 pthread_join() 的线程是 取消,则目标线程不应被分离。

所以,不。只要满足上述要求即可,无需采取任何额外措施。


0
投票

我不完全确定如果线程在

pthread_join()
声明其退出状态之前完成,为什么会出现问题?

这是完全正常的。

pthread_create()
在指定函数处启动新的执行线程。该函数立即运行,甚至可能抢占启动线程。线程有自己的局部变量(堆栈)和线程局部变量。所有其他共享内存访问都必须协调,否则就会发生数据争用。通常共享数据受到互斥体的保护。线程将继续运行(通常与其他线程并行),直到它被某些同步操作阻塞或线程退出其启动函数。

线程可以使用

pthread_join()
等待其他线程成功完成执行。就像 usr 指出的那样,如果线程已经完成,pthread_join() 将不会等待。

© www.soinside.com 2019 - 2024. All rights reserved.