pthread多线程

news/2024/12/28 21:37:51/

pthread是linux下C语言执行多线程操作的基础,操作多线程的操作全部在pthread.h头文件中,跟线程密切相关的操作包括创建、退出以及主线程的等待。

一、创建线程

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

1、参数
函数的第一个参数返回的是一个线程的指针,该指针唯一的标识创建的线程。
参数attr用来设置线程的属性,一般我们设置为NULL,即采用系统的默认设置。
第三个参数是线程将要执行的方法,或者说是线程的主体,该参数是一个函数指针,参数和返回值都是void*类型。
第四个参数是第三个参数代表的方法所需要的参数。
2、返回值
当创建线程成功时,该方法返回一个不为0的int。

二、离开线程(销毁线程)

void pthread_exit(void* retval)

该方法离开该线程,并且返回一个指向某个对象的指针(该指针不能用来指向一个局部变量,因为离开线程之后,线程被销毁,资源被释放)

三、等待线程
1、在绝大多数情况下,我们需要在主线程中等待子进程的完成,然后执行后续操作,这样我们就需要pthread_join函数来完成任务。
2、该方法类似于fork中的wait,但不同的是,该方法面向的对象是线程而非进程,主线程会一直挂起,直到等待的子线程返回。

int pthread_join(pthread_t t,void** thread_return)

参数t表示等待的子线程的唯一标识。
参数thread_return是一个void*值的地址,该参数得到的是线程的返回数据,即为pthred_exit中的参数值。

四 、示例
在主线程中创建一个线程,然后等待子线程完成,并且在子线程中修改了一个全局变量message,然后等子线程返回后在重新打印message的值。

#include <stdio.h>
#include <pthread.h>
#include <string.h>char message[] = "hello word!";
void *threadTest(void *arg)
{printf("test thread is running, the argument is: %s\n", (char*)arg);strcpy(message,"good bye!");pthread_exit("thank you for cpu time!");
}
int main()
{pthread_t threadID;void *threadRes;int res;res = pthread_create(&threadID, NULL, threadTest, (void *)message);if (res != 0){printf("pthread creat error!\n");}printf("waiting test thread finish.\n");res = pthread_join(threadID, &threadRes);if (res != 0){printf("pthread join error!\n");}printf("pthread join result is: %s\n", (char *)threadRes);printf("message now is: %s\n", message);pthread_exit(NULL);return 0;
}

运行:gcc thread.c -o test -lpthread

waiting test thread finish.
test thread is running, the argument is: hello word!
pthread join result is: thank you for cpu time!
message now is: good bye!

http://www.ppmy.cn/news/63147.html

相关文章

TCP三次握手

TCP三次握手 文章目录 TCP三次握手1. TCP三次握手过程和状态变迁1. 准备工作2. 进行连接 2. 能把三次握手改为两次握手吗&#xff1f;3. 改为两次握手会出现什么后果&#xff1f;4. 改为四次握手行不行&#xff1f;5. TCP第三次握手失败了怎么办&#xff1f;6. 三次握手是否可以…

X.25,帧中继(FR),ATM三种分组交换系统

X.25、帧中继&#xff08;FR&#xff09;、ATM 是流行的三种分组交换系统&#xff0c;它们具有不同的特点。 两个术语&#xff1a; DTE(Data Terminal Equipment) &#xff0c;数据终端设备&#xff0c;如我们的个人电脑、手机。 DCE(Data Circuit Equipment) &#xff0c;数据…

中国古代文学发展史

一、先秦神话和诗歌 1、上古神话 所谓神话&#xff0c;是上古时代的人们&#xff0c;对其所接触的自然现象、社会现象所幻想出来的艺术意味的解释和描叙的集体口头创作。上古神话以故事的形式表现了远古人民对自然、社会现象的认识和愿望。 上古神话的主要内容有&#xff1a…

实验五 Java多线程程序设计

实验目的 掌握Runnable接口实现多线程的方法掌握Thread类实现多线程的用法掌握Java语言中多线程编程的基本方法 实验内容 线程接力&#xff08;45分&#xff09; 编写一个应用程序&#xff0c;除了主线程外&#xff0c;还有三个线程&#xff1a;first、second和third。firs…

AI 工具合辑盘点(七)持续更新 之 AI 音频生成工具

AI 音频生成工具 想要不亲自录制&#xff0c;快速将文本转换为语音&#xff1f;AI 音频生成工具为你提供数千种语音选择&#xff0c;从“普通人”的声音到模仿演员、政治家或电影角色的合成声音&#xff0c;各种声音应有尽有 &#x1f5e3; AI 音频生成工具可用于创建商业用途…

移动应用中字体库的设计与实现

随着移动设备的普及&#xff0c;用户对于手机应用的字体需求也越来越高。字体是手机应用的重要组成部分&#xff0c;其美观度和可读性直接影响到用户的使用体验。因此&#xff0c;开发一款优秀的字体库是非常必要的。 在 APPCan 中&#xff0c;开发字体库的支持是非常重要的。下…

前端开发代码规范工具

规范化是前端工程化的一个重要部分。现在&#xff0c;有许多工具能够辅助我们实行代码的规范化,比如你一定知道的 ESLint 和 Prettier。 今天&#xff0c;来聊聊这些工具的工作原理和基本使用&#xff0c;了解它们是如何发挥作用的&#xff0c;以及如何更好地利用这些工具去规…

破解马赛克有多「容易」?

刷短视频时&#xff0c;估计大家都看过下面这类视频&#xff0c;各家营销号争相曝光「一分钟解码苹果笔刷背后内容」的秘密。换汤不换药&#xff0c;自媒体们戏称其为「破解马赛克」&#xff0c;殊不知让多少不明真相的用户建立起了错误的认知&#xff0c;也让苹果笔刷第 10086…