是否可以在不使用pthread_join()的情况下使用pthreads
Is it possible to use pthreads without pthread_join()?
我最近在尝试为工作中的项目向我的一些代码添加一些多线程功能时注意到,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;}
的机会。这里会发生两件事中的一件。
- 您已经使用足够高的优化进行了编译,编译器会使整个循环消失。线程从来没有机会执行,因为main启动线程,然后立即返回零
- 编译器不会优化循环。有了这个繁忙的循环,您又一次没有给线程机制一个滑入的机会
将sleep (0);
调用添加到该繁忙循环的主体中。
实际上你的代码对我来说很好,但我认为你的问题是主线程位于while()
循环中,占用了所有的CPU使用量,所以第二个线程永远没有机会。pthread_join
使它工作的事实有点转移注意力:它只是停止主线程,以便其他线程有机会。
显然,正确的解决方法是让主线程在无所事事时正常睡眠。对于测试代码,请尝试将sleep(1)
放入while循环中。
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在C++中如何在没有pow的情况下进行基础计算
- 松弛原子与无同步情况下的记忆连贯性
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 是否可以在不使用pthread_join()的情况下使用pthreads
- 能够在没有pthreads的情况下链接,并且程序仍然运行