我正在努力了解多线程的工作原理。我写了以下代码 `
void handler(void *arg)
{
printf("Printf from cleanup handler: %s\n", (char*)arg);
}
void print(const char *msg)
{
printf("%7s: Pid=%d Tid:%lu\n", msg, getpid(), pthread_self());
}
void* thread_function1(void *args)
{
printf("Received: %d\n", (int)args);
print("Thread");
pthread_cleanup_push(handler, "hello");
pthread_cleanup_pop(1);
printf("Thread Done\n");
return (void *) 0;
}
int main(void)
{
pthread_t tid1, tid2;
void *tret;
if(pthread_create(&tid1, NULL, thread_function1, (void *)1))
exit(1);
if(pthread_create(&tid2, NULL, thread_function1, (void *)2))
exit(1);
// pthread_join(tid2, &tret);
// pthread_join(tid1, &tret);
}
此代码的问题是主要在thread_function1
完成执行之前完成其执行。如果两个注释都被删除,则thread 2
仅在thread 1
完成执行后执行。
我想要做的是同时执行thread 1
和thread 2
,main
应该等待两个线程的完成。
答案 0 :(得分:5)
这段代码的问题在于,在thread_function1完成执行之前,main完成了它的执行。
那是因为当主线程退出时,进程会死亡,包括所有线程。您可以从主线程调用pthread_exit(0)
,以便其余线程继续执行并退出主线程。
如果两个注释都被删除,那么只有在线程1完成执行后才执行线程2。
那不是真的。即tid1
和tid2
在创建后同时执行(“同时执行”取决于您的硬件,调度策略等 - 但就您的程序而言,它们可被视为正在执行同时)。 pthread_join()
不控制线程执行的顺序。它只影响主线程等待完成线程的顺序,即主线程先等待tid2
先完成,然后等待tid1
(如果你是注释)那两行)。