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

Rob*_*oth 3 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*men 5

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

  1. 你已经编译了足够高的优化,编译器使整个循环消失.线程永远不会有机会执行,因为main启动线程然后立即返回零.
  2. 编译器不会优化循环.有了这个繁忙的循环,你再次没有给线程机制一个机会.

添加一个sleep (0);呼叫到该繁忙循环的主体.

  • @Oli:请参阅http://stackoverflow.com/questions/3592557/optimizing-away-a-while1-in-c0x. (4认同)
  • 编译器永远不会优化循环. (3认同)