pthread 线程基本函数

article/2025/9/19 7:26:07

文章目录

  • 一、`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_setcancelstate(int state, int *oldstate);`
  • 六、`int pthread_cancel(pthread_t tid);`
  • 七、


一、int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>void *thread_fun(void* arg)
{int num = *((int*)arg);printf("int the new thread: num = %d\n", num);
}int main(int argc, char *argv[])
{pthread_t tid;int test = 100;pthread_create(&tid, NULL, thread_fun, (void *)&test);while(1);return 0;
}

二、int pthread_join(pthread_t tid, void **thread_return);

等待线程结束并回收线程资源,此函数会阻塞,类似进程的 wait() 函数。如果线程已经结束,那么该函数会立即返回

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>void *thead_fun(void *arg)
{static int ret = 5; // thread_join.cpp:7:13: warning: address of local variable ‘ret’ returned [-Wreturn-local-addr]sleep(1);pthread_exit((void*)&ret);//return (void*)&ret;
}int main(int argc, char *argv[])
{pthread_t tid;void *ret = NULL;pthread_create(&tid, NULL, thead_fun, NULL);pthread_join(tid, &ret);printf("ret = %d\n", *((int*)ret));return 0;
}

三、int pthread_detach(pthread_t tid);

在默认情况下,线程的终止状态会保存到对该线程调用 pthread_join,然后才释放底层存储资源
如果线程处于分离状态,线程资源的回收工作交由系统完成,此函数不会阻塞
对分离状态的线程进行 pthread_join 调用会立即返回失败,返回 EINVAL

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>void *thead_fun(void *arg)
{for(int i=0; i<3; i++){printf("thread is runing\n");sleep(1);}return NULL;
}int main(int argc, char *argv[])
{pthread_t tid;pthread_create(&tid, NULL, thead_fun, NULL);pthread_detach(tid);if (pthread_join(tid, NULL)) // 立即返回,调用失败{printf("join not working\n");}printf("after join\n");sleep(5);printf("master is leaving\n");return 0;
}

在这里插入图片描述

四、void pthread_exit(void *retval);

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>void *thead_fun(void *arg)
{static int ret = 5; // thread_join.cpp:7:13: warning: address of local variable ‘ret’ returned [-Wreturn-local-addr]sleep(1);pthread_exit((void*)&ret);//return (void*)&ret;
}int main(int argc, char *argv[])
{pthread_t tid;void *ret = NULL;pthread_create(&tid, NULL, thead_fun, NULL);pthread_join(tid, &ret);printf("ret = %d\n", *((int*)ret));return 0;
}

五、int pthread_setcancelstate(int state, int *oldstate);

state:
PTHREAD_CANCEL_ENABLE 允许线程接收取消请求;
PTHREAD_CANCEL_DISABLE忽略取消请求
oldstate:
获取先前的取消状态

六、int pthread_cancel(pthread_t tid);

在默认的情况下,pthread_cancel 函数会使由 tid 标识的线程的行为表现为如同调用了参数为PTHEAD_CANCELED 的 pthread_exit 函数
pthread_cancel 并不等待线程终止,它仅仅提出请求,线程可以设置忽略 cancel 请求

七、

线程终止方法:

  • return:线程执行结束正常退出
  • pthread_cancel:被同一进程中其它线程取消
  • pthread_exit:线程自己调用 pthread_exit 退出

多线程编译:
线程函数在 pthread 库中,故链接时要加上参数 -lpthread,如:

g++ test.cpp -o test -lpthread

http://chatgpt.dhexx.cn/article/5ErqLfBv.shtml

相关文章

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; …

C++ error LNK2019无法解析外部符号

背景&#xff1a;用visual studio 2019开发MFC项目&#xff0c;第一次写c的项目&#xff0c;之前都是写c#和go的项目。 自定义一个类&#xff0c;引用自定义的类&#xff0c;具体的是引用.h文件&#xff0c;死活不成功&#xff0c;一直报error LNK2019无法解析外部符号这个错误…

VS在引用外库运行时显示无法解析外部符号

VS引用外库在运行时显示无法解析外部符号 问题截图 原因 链接器无法链接到 .lib&#xff0c;可以查看下图位置看库是否引入成功。 解决 检查库的配置是否正确。下面列出我在引用第三方库时的配置过程和注意事项。 使用cmake生成、vs编译生成的库&#xff0c;需要添加三个…

UE4使用UUserWidget无法解析外部符号

如图&#xff0c;明明vs代码没报错&#xff0c;但是编译的时候&#xff0c;总是提示&#xff1a; 那就说明&#xff0c;你的项目没有引入UMG模块&#xff1a; 找到这个文件&#xff0c;然后&#xff0c;在后面添加&#xff1a; 模块的介绍&#xff0c;网上一大堆&#xff0c;比…

vs+qt 动态库无法解析外部符号的问题

1、问题描述&#xff1a;无法解析的外部符号 解决方案&#xff1a;引用的库没有引用进来&#xff0c;结局方案如下&#xff1a; &#xff08;1&#xff09;先看一下生成的库输入位置在哪里。在动态库项目右击&#xff0c;选择“属性”->链接器->常规->输出文件。查看…