是否可以在没有pthread_join()的情况下使用pthreads?

时间:2011-06-21 22:10:06

标签: c++ c multithreading pthreads

最近我注意到,在尝试为我的某些代码添加一些多线程功能时,pthreads在后勤处理方面是一个巨大的痛苦......

这是场景......

我的main方法(服务器)中有一个无限循环,它产生线程来处理来自任何客户端的数据包的数据。问题是我无法让线程同时执行。他们拒绝开始执行,直到从main方法调用pthread_join(),这完全杀死了首先使用线程的整个目的(服务器需要停止执行流程,并等待线程在接收之前完成处理数据)再包了!太荒谬了。)

那么有没有办法使用pthreads并让它们实际上是多线程的?或者我最好不要使用线程,并通过停止在我的服务器中执行以调用函数来处理数据来节省额外的资源?

我想我每次都可能不得不求助...

令人沮丧......

我做的一些示例代码如下:

// gcc threads.c -lpthread
#include <stdio.h>
#include <pthread.h>

struct point{
    int x, y;
};

static void *print_point(void *point_p);

int main() {
    pthread_t tid;
    struct point pt = {3, 5};
    printf("enter main\n");
    pthread_create(&tid, NULL, print_point, &pt);
    while(1){continue;}
    return 0;
}

static void *print_point(void *point_p) {
    struct point arg = * (struct point *) point_p;
    printf("Point: (%d, %d)\n", arg.x, arg.y);
    return NULL;
}

当我运行并编译时(是的,我使用-lpthread开关编译),它打印“输入主”并且不执行线程...我甚至让它运行一段时间(起来,去了浴室,吃了一些食物),但仍然没有。

因为main方法产生一个线程然后无限循环,所以线程应该最终执行......对吗?从我从测试中可以看出,main方法永远不会放弃执行它产生的线程。唯一的方法是我可以通过调用join来让它通过调用join来放弃它(但是由于main将等待线程完成后,它会失败,因此无法使用线程。)

2 个答案:

答案 0 :(得分:5)

你永远不会让线程有机会用while(1){continue;}执行。这里将发生以下两件事之一。

  1. 你已经编译了足够高的优化,编译器使整个循环消失。线程永远不会有机会执行,因为main启动线程然后立即返回零。
  2. 编译器不会优化循环。有了这个繁忙的循环,你再次没有给线程机制一个机会进入。
  3. 向忙碌循环的正文添加sleep (0);次调用。

答案 1 :(得分:2)

实际上你的代码对我来说很好,但我认为你的问题是主线程位于while()循环中,占用了所有的CPU使用率,所以第二个线程永远不会有机会。 pthread_join使其工作的事实是一个红色的鲱鱼:它只是停止主线程,所以其他线程有机会。

显然,正确的解决方法是让主线程在无关紧要时正常睡眠。对于测试代码,请尝试将sleep(1)放入while循环中。

相关问题