是否可以在不使用pthread_join()的情况下使用pthreads

Is it possible to use pthreads without pthread_join()?

本文关键字:pthreads 情况下 join pthread 是否      更新时间:2023-10-16

我最近在尝试为工作中的项目向我的一些代码添加一些多线程功能时注意到,pthreads在逻辑上是一个巨大的难题。。。

以下是场景。。。

我的主方法(服务器)中有一个无限循环,每当它从任何客户端接收到数据包时,就会生成线程来处理数据。问题是我根本无法让线程同时执行。他们拒绝开始执行,直到从主方法调用pthread_join(),这从一开始就完全扼杀了使用线程的全部目的(服务器需要停止执行流,并等待线程完成数据处理后再接收数据包!荒谬!)

那么,有没有一种方法可以使用pthread并使它们真正成为多线程的呢?还是我最好根本不使用线程,通过停止服务器中的执行来调用函数来处理数据来节省额外的资源?

我想我可能每次都要用叉子。。。

这太令人沮丧了。。。。

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

// 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 mainn");
    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开关编译),它会打印"enter-main",而不执行线程。。。我甚至让它运行了一段时间(起床,去洗手间,吃了一些食物),但仍然一无所获。

因此,由于主方法产生了一个线程,然后无限循环,线程最终应该执行。。。正确的从我的测试中可以看出,主方法从未放弃对其派生的线程的执行。我能得到它的唯一方法是通过调用join来放弃它(但这违背了拥有线程的目的,因为main将等待线程完成)。

您永远不会给线程执行while(1){continue;}的机会。这里会发生两件事中的一件。

  1. 您已经使用足够高的优化进行了编译,编译器会使整个循环消失。线程从来没有机会执行,因为main启动线程,然后立即返回零
  2. 编译器不会优化循环。有了这个繁忙的循环,您又一次没有给线程机制一个滑入的机会

sleep (0);调用添加到该繁忙循环的主体中。

实际上你的代码对我来说很好,但我认为你的问题是主线程位于while()循环中,占用了所有的CPU使用量,所以第二个线程永远没有机会。pthread_join使它工作的事实有点转移注意力:它只是停止主线程,以便其他线程有机会。

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