如何在没有 pthread_join() 的情况下使 pthreads 并发工作
How to make pthreads work concurrent without pthread_join()
我正在制作一个让多个线程同时工作的程序。在弄乱代码一段时间后,我遇到了一个问题,我将一个字符串 (char *
) 发送到线程以进行进一步的操作,但不知何故该字符串根本没有发送。
后来,我写了一个非常简单的代码,我只是将一个字符串发送到一个线程,函数将它打印到控制台。我发现如果不使用 pthread_join()
,它根本不起作用。我不知道为什么,因为我知道每当调用 pthread_join()
时,它都会阻塞所有其他线程并等待该线程完成。
这是简单的程序:
void* prisntstr(void* string);
int main(int argc, char *argv[])
{
char* string = "Hello!";
pthread_t thread;
pthread_create(&thread, NULL, prisntstr, (void*)string);
pthread_join(thread, NULL);
}
void* prisntstr(void* string)
{
char* str = (char*)string;
printf("%s\n", str);
}
有谁知道我如何在不使用 pthread_join()
的情况下做到这一点?
如果您删除 pthread_join
,您的程序的问题是 main
正在返回,从而导致程序退出而不执行任何与其他线程同步并确定它是否是实际上完成了。当main
returns时,就好像你调用了exit
,整个过程就结束了。
除了 pthread_join
之外,还有很多方法可以让 main
等待其他操作完成。您可以等待其他线程 post 的信号量,您可以循环检查其他线程设置的数据等的条件变量
或者您可以 main
调用 pthread_exit
来终止初始线程。然后进程将不会退出,直到您调用 exit
或直到每个线程都退出。
调用 pthread_join()
的线程只是在等待另一个线程完成。请注意:
If that thread has already terminated, then pthread_join()
returns immediately
这是最优雅的方式,比其他方式更复杂,涉及 IPC 技术:
- 调用线程可以等待辅助线程mutex/semaphore放置
- 调用线程可以等待辅助线程发送的信号
- ...等等
所以基本上策略是:同步线程以便
- 主线程可以通过子线程计算获取一些信息
- 进程保持活动状态,直到子线程完成其操作(如本例)
没有 pthread_join()
你看不到打印到 stdout 的消息的原因是一旦 main 终止,它就会终止整个进程 all children threads are terminated;在您的情况下,在执行打印之前。
当您在程序中使用线程时,创建的线程将成为子线程,而主程序将成为主线程。所以,我们需要阻塞主线程,让它无法关闭。
如果主线程关闭则子线程也将退出。
因此,您需要找到如何阻止主线程不退出的方法。
thread 为我们提供了 pthread_join() 的便利。这将阻塞主线程,直到子线程工作。主线程将阻塞在 pthread_join() 行。它不会执行其他行。
如果你不想使用 pthread_join() 你需要找到其他方法。
Ex:
while(1);
- 同时(1);在您终止进程之前不会结束主线程。
我正在制作一个让多个线程同时工作的程序。在弄乱代码一段时间后,我遇到了一个问题,我将一个字符串 (char *
) 发送到线程以进行进一步的操作,但不知何故该字符串根本没有发送。
后来,我写了一个非常简单的代码,我只是将一个字符串发送到一个线程,函数将它打印到控制台。我发现如果不使用 pthread_join()
,它根本不起作用。我不知道为什么,因为我知道每当调用 pthread_join()
时,它都会阻塞所有其他线程并等待该线程完成。
这是简单的程序:
void* prisntstr(void* string);
int main(int argc, char *argv[])
{
char* string = "Hello!";
pthread_t thread;
pthread_create(&thread, NULL, prisntstr, (void*)string);
pthread_join(thread, NULL);
}
void* prisntstr(void* string)
{
char* str = (char*)string;
printf("%s\n", str);
}
有谁知道我如何在不使用 pthread_join()
的情况下做到这一点?
如果您删除 pthread_join
,您的程序的问题是 main
正在返回,从而导致程序退出而不执行任何与其他线程同步并确定它是否是实际上完成了。当main
returns时,就好像你调用了exit
,整个过程就结束了。
除了 pthread_join
之外,还有很多方法可以让 main
等待其他操作完成。您可以等待其他线程 post 的信号量,您可以循环检查其他线程设置的数据等的条件变量
或者您可以 main
调用 pthread_exit
来终止初始线程。然后进程将不会退出,直到您调用 exit
或直到每个线程都退出。
调用 pthread_join()
的线程只是在等待另一个线程完成。请注意:
If that thread has already terminated, then
pthread_join()
returns immediately
这是最优雅的方式,比其他方式更复杂,涉及 IPC 技术:
- 调用线程可以等待辅助线程mutex/semaphore放置
- 调用线程可以等待辅助线程发送的信号
- ...等等
所以基本上策略是:同步线程以便
- 主线程可以通过子线程计算获取一些信息
- 进程保持活动状态,直到子线程完成其操作(如本例)
没有 pthread_join()
你看不到打印到 stdout 的消息的原因是一旦 main 终止,它就会终止整个进程 all children threads are terminated;在您的情况下,在执行打印之前。
当您在程序中使用线程时,创建的线程将成为子线程,而主程序将成为主线程。所以,我们需要阻塞主线程,让它无法关闭。
如果主线程关闭则子线程也将退出。 因此,您需要找到如何阻止主线程不退出的方法。 thread 为我们提供了 pthread_join() 的便利。这将阻塞主线程,直到子线程工作。主线程将阻塞在 pthread_join() 行。它不会执行其他行。
如果你不想使用 pthread_join() 你需要找到其他方法。
Ex:
while(1);
- 同时(1);在您终止进程之前不会结束主线程。