Synchronization pthread_join(tid和retval)的工作;
为什么调用pthread_jointid和&retval的主函数不等待线程id等于tid的线程关闭 详细信息-我正在尝试创建带有多线程的简单文件复制程序,这样我就可以了解更多关于互斥锁、信号量和死锁的信息,但不必在主线程中使用睡眠,我的程序将在不复制数据或不完全复制的情况下终止。注意,我正在子线程中调用pthread_exitretval 这是代码 下面是另一段代码,它运行无限计数器以检查即使在调用pthread_join时子线程是否过早结束。 -结果:它不会过早结束。在后一个代码中,主线程会等待子线程关闭。Synchronization pthread_join(tid和retval)的工作;,synchronization,multithreading,deadlock,Synchronization,Multithreading,Deadlock,为什么调用pthread_jointid和&retval的主函数不等待线程id等于tid的线程关闭 详细信息-我正在尝试创建带有多线程的简单文件复制程序,这样我就可以了解更多关于互斥锁、信号量和死锁的信息,但不必在主线程中使用睡眠,我的程序将在不复制数据或不完全复制的情况下终止。注意,我正在子线程中调用pthread_exitretval 这是代码 下面是另一段代码,它运行无限计数器以检查即使在调用pthread_join时子线程是否过早结束。 -结果:它不会过早结束。在后一个代码中,主线程会等
因此,为什么第一个代码没有以这种方式运行。一种假设线程实际完成的方法,以及我尚未了解的其他可能的问题,就是使用互斥锁,或者类似以下内容的方法:
#include <err.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <unistd.h>
pthread_mutex_t Lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t Job_Done = PTHREAD_COND_INITIALIZER;
unsigned long Threads_Completed;
void *worker(void *unused);
int main(void)
{
pthread_t *tids;
struct timespec wait;
if ((tids = calloc(sizeof(pthread_t), 42)) == NULL)
err(EX_OSERR, "could not calloc() threads list");
fprintf(stderr, "dbg starting...\n");
for (unsigned int i = 0; i < 42; i++) {
if (pthread_create(&tids[i], NULL, worker, NULL) != 0)
err(EX_OSERR, "could not pthread_create() thread %u", i);
}
wait.tv_sec = 7;
wait.tv_nsec = 0;
for (;;) {
pthread_mutex_lock(&Lock);
if (Threads_Completed == 42)
break;
pthread_cond_timedwait(&Job_Done, &Lock, &wait);
pthread_mutex_unlock(&Lock);
}
fprintf(stderr, "dbg all done!\n");
exit(EXIT_SUCCESS);
}
void *worker(void *unused)
{
sleep(3 + rand() % 7); // actual work here
fprintf(stderr, "dbg done!\n");
pthread_mutex_lock(&Lock);
Threads_Completed++;
pthread_mutex_unlock(&Lock);
pthread_cond_signal(&Job_Done);
return (void *) 0;
}
您是否调用pthread_detachtid或使用pthread_attr_setdetachedstate在分离状态下创建线程?不,我不知道它们,也没有调用它们。我应该发布源代码吗?是,发布代码会很有帮助-谢谢。抱歉,我不知道在这个网站上发布代码,所以我使用了ideone.com网站。一些字段在代码中是多余的,注释是无用的,它们只是用来做实验。你确定capsule->val1是非零的吗?我建议您尝试创建一个简单的示例来练习您遇到问题的代码。可能有一个计数为10的线程,其间有一秒的暂停。创建它,让它运行,对它执行pthread_连接,查看pthread_连接的行为是否符合预期。然后开始逐渐增加复杂性。类似的方法会起作用,但没有必要,因为pthread_join会帮你做到这一点。pthread_join不是问题所在。@vishvajeetpa直到我坚持我以前的建议为止。您试图一次编写和测试太多的代码。我建议您从一个工作的pthread_create/pthread_join开始,然后逐步添加和测试—一次添加一点代码。这将是追踪出问题的最简单方法。