pthread 线程创建

article/2025/9/19 8:44:15

 1.1代码


#include <pthread.h>
#include <stdio.h>
#include <unistd.h>static int my_thread_func (void *data)
{while(1){sleep(1);}
}main()
{pthread_t tid;int ret;// 1.创建接收线程ret = pthread_create(&tid, NULL,my_thread_func, NULL);if(ret){printf("pthread_create error!\n");}//2.主线程读取标准输入,发给“接收线程”while(1){sleep(1);}return 0;
}

 1.2执行命令:gcc  -o pthread1 pthread1.c -lpthread

1.3运行代码:./pthread1

1.4.查看进程: ps 

1.5.查看线程:ps -T

1.6.查看task

2.1 删除之前的线程 :kill -9 18690 

2.2. 代码

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>static char g_buf[1000];
static int g_hasData = 0;static int my_thread_func (void *data)
{while(1){//sleep(1);// 等待通知while(g_hasData == 0);    //一直死等,非常消耗CPU资源//打印printf("recv:%s\n",g_buf);g_hasData = 0;}
}main()
{pthread_t tid;int ret;// 1.创建接收线程ret = pthread_create(&tid, NULL,my_thread_func, NULL);if(ret){printf("pthread_create error!\n");}//2.主线程读取标准输入,发给“接收线程”while(1){fget(g_buf,1000,stdin);//通知接收线程g_hasData = 1;}return 0;
}

2.3 执行命令:gcc  -o pthread2 pthread2.c -lpthread

2.4运行代码:./pthread2      注意:程序中使用了fget函数,所以不能使用后台执行./pthread2 &

2.5 查看进程:ps

 2.5查看线程:ps -T

2.6  再次执行程序并发送123456,接收到123456

2.7  用另一个终端执行命令:top    , 发现如此简单的程序尽然消耗CPU资源如此之高

3.1 代码(使用信号量优化上边代码)

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>static char g_buf[1000];
static sem_t g_sem;
static void *my_thread_func (void *data)
{while (1){//sleep(1);// 等待通知 //while (g_hasData == 0);sem_wait(&g_sem);// 打印 printf("recv: %s\n", g_buf);}return NULL;
}int main(int argc, char **argv)
{pthread_t tid;int ret;sem_init(&g_sem, 0, 0);// 1. 创建"接收线程" ret = pthread_create(&tid, NULL, my_thread_func, NULL);if (ret){printf("pthread_create err!\n");return -1;}// 2. 主线程读取标准输入, 发给"接收线程" while (1){fgets(g_buf, 1000, stdin);// 通知接收线程 sem_post(&g_sem);}return 0;
}

3.2 执行命令:gcc -o pthread3 pthread3.c -lpthread

3.3运行代码:./pthread

3.4查看进程 :ps

 3.5 查看线程:ps -T

 3.6  用另一个终端执行命令:top ,发现在前根本看不到pthread3,说明优化后基本不占CPU资源

 由于g_buf在主线程里正在写入时,子线程也去读取,数据就会乱,所以需要再次优化,加入互斥进行同步数据

4.1.代码(使用信号量加互斥优化上边代码)

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>static char g_buf[1000];
static sem_t g_sem;
static pthread_mutex_t g_tMutex  = PTHREAD_MUTEX_INITIALIZER;static void *my_thread_func (void *data)
{while (1){//sleep(1);//等待通知 //while (g_hasData == 0);sem_wait(&g_sem);//打印 pthread_mutex_lock(&g_tMutex);printf("recv: %s\n", g_buf);pthread_mutex_unlock(&g_tMutex);}return NULL;
}int main(int argc, char **argv)
{pthread_t tid;int ret;char buf[1000];sem_init(&g_sem, 0, 0);//1. 创建"接收线程" ret = pthread_create(&tid, NULL, my_thread_func, NULL);if (ret){printf("pthread_create err!\n");return -1;}//2. 主线程读取标准输入, 发给"接收线程" while (1){fgets(buf, 1000, stdin);pthread_mutex_lock(&g_tMutex);memcpy(g_buf, buf, 1000);pthread_mutex_unlock(&g_tMutex);// 通知接收线程 sem_post(&g_sem);}return 0;
}

 4.2.执行命令:gcc -o pthread4 pthread4.c -lpthread

4.3.如果按如下所示增加互斥,主线程输入占用时间较多,就会一直互斥在主线里,接收线程接收不到数据

//2. 主线程读取标准输入, 发给"接收线程" while (1){pthread_mutex_lock(&g_tMutex);fgets(g_buf, 1000, stdin);pthread_mutex_unlock(&g_tMutex);// 通知接收线程 sem_post(&g_sem);}

 5.1.代码(使用条件变量加互斥优化上边代码)

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>static char g_buf[1000];
static pthread_mutex_t g_tMutex  = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t  g_tConVar = PTHREAD_COND_INITIALIZER;static void *my_thread_func (void *data)
{while (1){//sleep(1);// 等待通知 //while (g_hasData == 0);pthread_mutex_lock(&g_tMutex);pthread_cond_wait(&g_tConVar, &g_tMutex);//等待接受主线程发来信号	//打印printf("recv: %s\n", g_buf);pthread_mutex_unlock(&g_tMutex);}return NULL;
}int main(int argc, char **argv)
{pthread_t tid;int ret;char buf[1000];//1. 创建"接收线程" ret = pthread_create(&tid, NULL, my_thread_func, NULL);if (ret){printf("pthread_create err!\n");return -1;}//2. 主线程读取标准输入, 发给"接收线程" while (1){fgets(buf, 1000, stdin);pthread_mutex_lock(&g_tMutex);memcpy(g_buf, buf, 1000);pthread_cond_signal(&g_tConVar); //通知接收线程 pthread_mutex_unlock(&g_tMutex);}return 0;
}

5.2 执行命令:gcc -o pthread5 pthread5.c -lpthread

5.3运行代码:./pthread5

 5.4查看进程:ps

5.5查看线程:ps -T

 5.6查看CPU占用率:top,发现pthread5几乎不占用CPU资源


http://chatgpt.dhexx.cn/article/TM9nfB74.shtml

相关文章

C语言pthread.h运用

线程概念 什么是多线程&#xff0c;提出这个问题的时候&#xff0c;我还是很老实的拿出操作系统的书&#xff0c;按着上面的话敲下“为了减少进程切换和创建开销&#xff0c;提高执行效率和节省资源&#xff0c;我们引入了线程的概念&#xff0c;与进程相比较&#xff0c;线程…

linux pthread头文件,pthread t 头文件_uint8 t 头文件_pthread t 头文件

多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。 多线程程序包含可以同时运行的两个或多个部分。这样的程序中的每个部分称为一个线程,每个线程定义了一个单独的执行路径。 本…

Day 55 Linux 线程控制语句pthread_exit pthread_join pthread_detach pthread_cancel 线程属性

目录 1. 线程控制语句 1.1pthread_exit函数 1.2pthread_join函数 1.3pthread_detach函数 1.4pthread_cancel函数 控制原语对比 2. 线程属性 2.1线程属性初始化 2.2线程的分离状态 2.3线程使用注意事项 1. 线程控制语句 1.1pthread_exit函数 将单个当前线程退出 void…

pthread 线程基本函数

文章目录 一、int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);二、int pthread_join(pthread_t tid, void **thread_return);三、int pthread_detach(pthread_t tid);四、void pthread_exit(void *retval);五、int …

pthread

POSIX线程&#xff08;POSIX threads&#xff09;&#xff0c;简称Pthreads&#xff0c;是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统&#xff08;Unix、Linux、Mac OS X等&#xff09;中&#xff0c;都使用Pthreads作为操作系统的线程。 1、p…

线程以及pthread库的使用

一.什么是线程 你可以想象你一边听歌一边打游戏&#xff0c;如果是操作系统会怎么做呢&#xff1f;先执行 ListenMusic 再执行 PlayGame&#xff0c;还是先执行 PlayGame 再执行 ListenMusic 呢&#xff1f;好像都不太合适。为了实现这个目的&#xff0c;就需要引入线程这个概念…

多线程02---pThread简介

1.简介 pthread 是属于 POSIX 多线程开发框架。它是c语言提供的一个跨平台的多线程解决方案。由于其在iOS编程中&#xff0c;操作比较麻烦&#xff0c;一般不用&#xff0c;这里介绍仅仅作为了解。 2.pthread的使用 通过以下函数创建pthread&#xff0c;在C语言中类型的结尾…

Qt 无法识别的外部符号.无法解析的外部符号

原因: 很多博客都说了这个原因,是因为后续在自己的类中,引入Q_OBJECT , 导致vs无法自动生成 moc_XXX.cpp类似的文件, 编译时候,找不到导致的(符号链接). 他人解决办法: 看了很多博客,说用moc_xx.exe, 重新生成对应的.h头文件,一下,就可以了;有的建议重新把类添加一下,然后清…

Qt项目 无法解析的外部符号_WinMainCRTStartup

1、无法解析的外部符号_WinMainCRTStartup 在编译Qt项目的时候突然说找不到_WinMainCRTStartup函数&#xff0c;_WinMainCRTStartup是Qt的主函数。找不到可能是main函数不在工程中。 选中main.cpp点击编译 点击移除再重新添加

QT无法解析的外部符号问题

moc_widget.obj:-1: error: LNK2019: 无法解析的外部符号 "private: void __thiscall Widget::on_pushButton_6_clicked(void)" (?on_pushButton_6_clickedWidgetAAEXXZ)&#xff0c;该符号在函数 "private: static void __cdecl Widget::qt_static_metacall(c…

QT疑难解决:无法解析的外部符号

无法解析的外部符号 _imp_XXXXXXXXX 出现字符_imp&#xff0c;说明不是真正的静态库&#xff0c;而是某个动态库的导入库&#xff0c;导入函数和自己不同名&#xff0c;所以加了字符_imp。 引入相应库 打开MSDN搜索函数xxxxx&#xff1a;http://msdn.microsoft.com/en-us/dn…

CUDA编程时遇到无法解析外部符号threadIdx或blockIdx问题的解决办法

在CUDA编程时遇到出现无法解析外部符号threadIdx或blockIdx问题的解决办法 在CUDA编程之前要确保工程项目的配置属性一致性如图一所示。然后点击项目—>属性确保配置属性无误。 VC 目录 可执行文件目录&#xff1a;…\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin 包含目…

LNK2019 无法解析的外部符号

LNK 2019 遇到了很多次这个错误&#xff0c;会持续更新遇到该错误产生的原因和解决方法 这个错误是由于我们调用的函数所定义的某个文件在编译时没有正确链接导致的&#xff0c;错误显示如下&#xff1a; 然后根据错误提示找到该函数 ImGui_ImplOpenGL3_Shutdown();ImGui_Impl…

无法解析的外部符号解决方法

步骤1&#xff1a; 按无法解析的顺序来解决问题 比如有两个无法解析&#xff0c;先解决第一个。 步骤2&#xff1a; 点击LNK2001,会跳转到网页&#xff0c;网页会提示哪些无法解析的问题是由哪个无法解析的错误引起的&#xff0c;这样可以减少解决无法解析的错误。 步骤3. …

无法解析的外部符号问题小结

问题1&#xff1a;在编写通信相关程序中&#xff0c;引用了一个静态库&#xff08;该静态库编译没有问题&#xff0c;并被其他项目引用&#xff09;&#xff0c;该库是对SOCKET的一个封装。基本结构如下&#xff1a; 在属性中添加了该库的引用后&#xff0c;编译仍然报错&#…

无法解析的外部符号main

今天在写程序的时候遇到个问题&#xff1a; 然后就去看了相应的解决方法 发现都不管用&#xff1a; 1.不是文件名.c或.cpp的问题 2.不是没有包含相应头文件的问题 3.不是写的控制台程序而使用的Windows连接程序&#xff08;Winmain&#xff09; 最后发现是因为在刚开始打开项…

无法解析的外部符号xxx 该符号在函数xxx中被引用

无法解析的外部符号xxx 该符号在函数xxx中被引用 更多相关错误可查看&#xff1a;https://blog.csdn.net/weixin_44120025/article/details/115279563 下面主要讲述一个解决方案中包含多个项目且它们之间互相引用的情况。 在一个解决方案已经有多个项目的情况下创建一个项目&am…

Visual Studio 2022配置GAMP出现 LNK2019无法解析外部符号_imp_timeGetTime@0

#vs2022配置GAMP 使用visual studio 2022配置软件GAMP的过程可以参考vs2019配置GAMP的详细过程。 在vs2022按照vs2019配置过程后&#xff0c;生成解决方案时&#xff0c;出现了LNK2019 无法解析的外部符号 _imp_timeGetTim0, 函数_tickget中引用了该符号。 解决方法如下&#…

跟着LearnOpenGLCN学习OpenGL配置GLAD环境时出现无法解析外部符号问题的解决

根据LearnOpenGLCN里的步骤&#xff1a; 1.将解压下来的glad和KHR直接复制到glfw-3.3.4.bin.WIN32的include里。 2.glad.c放到工程文件中去。 3.GLFW和GLAD配置环境 第一步&#xff1a; 第二步&#xff1a; 在配置环境后&#xff0c;运行调用窗口代码&#xff0c;出现以下错…

VS配置PCL“无法解析外部符号”

一开始报错&#xff1a; 一般原因是没有包括需要的 .lib 报错说明可能出现在vtk 和pcl_visualization 的lib上。在依赖库中添加pcl_visualization.lib 或者在.cmake文件中添加visualization重新编译&#xff0c;如下&#xff1a; 之后&#xff0c;报错只有两条&#xff1a; …