同时在两个无限循环中创建多个线程

时间:2018-08-08 12:13:43

标签: c pthreads

我正在学习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;
}

2 个答案:

答案 0 :(得分:2)

首先,除非我解决了某些问题,否则您的程序无法在我的计算机上编译。最值得注意的是,您需要传递函数而不调用函数,因此必须在func1调用中的func2pthread_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;
}