我正在学习C和pthread库,但是在使用无限循环在函数中启动两个线程时遇到问题。
从不调用第二个pthread_create。 如何创建两个线程?
我的代码看起来像
void* func1() {
while (1) {
printf("%s\n", "func1");
sleep(2);
}
}
void* func2() {
while (1) {
printf("%s\n", "func2");
sleep(2);
}
}
int main()
{
pthread_t thread_id;
pthread_t thread_id2;
pthread_create(&thread_id, NULL, func1(), NULL);
pthread_create(&thread_id2, NULL, func2(), NULL);
return 0;
}
答案 0 :(得分:2)
首先,除非我解决了某些问题,否则您的程序无法在我的计算机上编译。最值得注意的是,您需要传递函数而不调用函数,因此必须在func1
调用中的func2
和pthread_create
之后删除括号。不会产生任何错误/警告的代码的有效版本(在这种情况下只是一些不相关的类型,但通常pthread似乎希望一切都是void*
):
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* func1(void*) {
while (1) {
printf("%s\n", "func1");
sleep(2);
}
}
void* func2(void*) {
while (1) {
printf("%s\n", "func2");
sleep(2);
}
}
int main()
{
pthread_t thread_id;
pthread_t thread_id2;
pthread_create(&thread_id, NULL, func1, NULL);
pthread_create(&thread_id2, NULL, func2, NULL);
//sleep(60);
return 0;
}
现在针对您的问题,如文档(http://man7.org/linux/man-pages/man3/pthread_create.3.html中所述),如果程序的主线程退出,则所有线程都会退出-就像您的情况一样。
因此,您的程序(一旦我们帮助它进行编译)确实尝试创建第二个线程,但是与此相关的一些开销,并且它实际上从未设法在return 0;
之前打印在main
中到达。这将导致程序退出,并且您永远看不到第二个线程的输出。一个简单的解决方法是在创建线程之后添加另一个sleep
命令,这使它们有足够的时间进行打印。
答案 1 :(得分:1)
此外,您还需要使用pthread_attr_init初始化线程属性,并告诉main使用pthread_join直到子线程完成。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include<errno.h>
void *func1(void *p) {
while (1) {
printf("%s\n", "func1");
sleep(2);
}
}
void *func2(void *p) {
while (1) {
printf("%s\n", "func2");
sleep(2);
}
}
int main()
{
pthread_attr_t attr;
pthread_t thread_id;
pthread_t thread_id2;
pthread_attr_init(&attr);
pthread_create(&thread_id, &attr, &func1, NULL);
pthread_create(&thread_id2, &attr, &func2, NULL);
pthread_join(thread_id,NULL);
pthread_join(thread_id2,NULL);
//sleep(60);
return 0;
}