c语言 标准多线程库,关于C语言多线程pthread库的功能描述
与线程相关的说明
һpthread_t
pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:
typedef unsigned long int pthread_t;
它是一个线程标识符.
两个pthread_create
函数pthread_create用于创建线程,其原型为:
extern int pthread_create __P((pthread_t * __ thread,__const pthread_attr_t * __ attr,
无效*(* __ start_routine)(无效*),无效* __ arg));
第一个参数是指向线程标识符的指针,第二个参数用于设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数. 在这里,我们的函数线程不需要任何参数,因此最后一个参数设置为空指针. 我们还将第二个参数设置为空指针,这将生成具有默认属性的线程. 在下一节中,我们将详细介绍线程属性的设置和修改. 成功创建线程后,该函数返回0. 如果不为0,则意味着线程创建失败. 常见的错误返回码是EAGAIN和EINVAL. 前者表明系统限制了新线程的创建,例如c同时启动多个pthread,线程太多;后者表示第一个. 由两个参数表示的线程属性值是非法的. 成功创建线程后,新创建的线程将运行由参数三和参数四确定的功能,而原始线程将继续运行下一行代码.
三个pthread_join pthread_exit
函数pthread_join用于等待线程结束. 函数原型为:
extern int pthread_join __P((pthread_t __th,void ** __ thread_return));
第一个参数是等待线程的标识符,第二个参数是用户定义的指针,可用于存储等待线程的返回值. 该功能是线程阻塞功能. 调用它的函数将等待,直到等待线程结束. 当函数返回时,将恢复等待线程的资源. 结束线程有两种方法. 一个是,就像上面的示例一样,函数结束,并且调用它的线程结束. 另一种方法是通过函数pthread_exit.
其功能原型为:
extern void pthread_exit __P((void * __ retval))__attribute__((__noreturn __));
唯一的参数是函数的返回码,只要pthread_join中的第二个参数thread_return不为NULL,该值就会传递给thread_return. 最后要注意的是,一个线程不能被多个线程等待,否则,第一个成功接收到信号的线程将返回,而其余名为pthread_join的线程将返回错误代码ESRCH.
在本节中,我们编写了最简单的线程,并掌握了三个最常用的函数pthread_createc同时启动多个pthread,pthread_join和pthread_exit. 下面,让我们了解线程的一些常见属性以及如何设置这些属性.
与互斥锁有关
互斥锁用于确保一段时间内只有一个线程正在执行一段代码.
һpthread_mutex_init
函数pthread_mutex_init用于生成互斥量. NULL参数指示使用默认属性. 如果需要声明特定的属性互斥锁,则必须调用函数pthread_mutexattr_init. 函数pthread_mutexattr_setpshared和函数pthread_mutexattr_settype用于设置互斥锁的属性. 上一个函数设置属性pshared,该属性具有两个值PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED. 前者用于同步不同进程中的线程,后者用于同步进程中的不同线程. 在上面的示例中,我们使用默认属性PTHREAD_PROCESS_ PRIVATE. 后者用于设置互斥锁的类型,可选类型为PTHREAD_MUTEX_NORMAL,PTHREAD_MUTEX_ERRORCHECK,PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT. 它们分别定义了不同的上下解锁机制. ,通常选择最后一个默认属性.
两个pthread_mutex_lock pthread_mutex_unlock pthread_delay_np
pthread_mutex_lock语句开始使用互斥锁进行锁定. 之后,代码被锁定,直到调用pthread_mutex_unlock,即一次只能由一个线程调用和执行. 当一个线程执行到pthread_mutex_lock时,如果此时该锁被另一个线程使用,则该线程被阻塞,即程序将等待,直到另一个线程释放该互斥锁.
这里是一个例子. 我们通过创建两个线程来实现数字的增量.
#include
#include
#include
#include
#define MAX 10
pthread_t thread[2];
pthread_mutex_t mut;
int number=0, i;
void *thread1()
{
printf ("thread1 : I'm thread 1\n");
for (i = 0; i < MAX; i++)
{
printf("thread1 : number = %d\n",number);
pthread_mutex_lock(&mut);
number++;
pthread_mutex_unlock(&mut);
sleep(2);
}
printf("thread1 :主函数在等我完成任务吗?\n");
pthread_exit(NULL);
}
void *thread2()
{
printf("thread2 : I'm thread 2\n");
for (i = 0; i < MAX; i++)
{
printf("thread2 : number = %d\n",number);[nextpage]
pthread_mutex_lock(&mut);
number++;
pthread_mutex_unlock(&mut);
sleep(3);
}
printf("thread2 :主函数在等我完成任务吗?\n");
pthread_exit(NULL);
}
void thread_create(void)
{
int temp;
memset(&thread, 0, sizeof(thread)); //comment1
/*创建线程*/
if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2
printf("线程1创建失败!\n");
else
printf("线程1被创建\n");
if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3
printf("线程2创建失败");
else
printf("线程2被创建\n");
}
void thread_wait(void)
{
/*等待线程结束*/
if(thread[0] !=0) { //comment4
pthread_join(thread[0],NULL);
printf("线程1已经结束\n");
}
if(thread[1] !=0) { //comment5
pthread_join(thread[1],NULL);
printf("线程2已经结束\n");
}
}
int main()
{
/*用默认属性初始化互斥锁*/
pthread_mutex_init(&mut,NULL);
printf("我是主函数哦,我正在创建线程,呵呵\n");
thread_create();
printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");
thread_wait();
return 0;
}
让我们先编译并执行
报价:
falcon @ falcon: 〜/ program / c / code / ftp $ gcc -lpthread -o thread_example thread_example.c
falcon @ falcon: 〜/ program / c / code / ftp $ ./thread_example
我是主要功能,我正在创建一个线程,呵呵
线程1已创建
创建线程2
我是主要功能,我正在等待线程完成任务,呵呵
线程1: 我是线程1
线程1: 数字= 0
线程2: 我是线程2
线程2: 数字= 1
线程1: 数字= 2
thread2: 数字= 3
线程1: 数字= 4
线程2: 数字= 5
线程1: 数字= 6
线程1: 数字= 7
线程2: 数字= 8
线程1: 数字= 9
thread2: 数字= 10
线程1: 主要功能正在等待我完成任务吗?
线程1已经结束
thread2: 主要功能正在等待我完成任务吗?
线程2已结束
上面对C语言多线程pthread库的相关功能的描述是我与您共享的所有内容. 我希望能给您参考,也希望您能支持该脚本主页.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-257271-1.html
c语言 标准多线程库,关于C语言多线程pthread库的功能描述相关推荐
- 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库
一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...
- 易语言 标准c 动态库,易语言Dll动态库的开发
一.关于易语言DLL 易语言Dll动态库的开发是编程当中和其他语言开发进行交互必不可少的方法之一,从易语言3.6版开始,已经能够支持对DLL动态链接库的开发, 编译出的DLL是标准的DLL,和其他编程 ...
- C运行库和C语言函数库/Microsoft C运行库
C运行库和C语言函数库/Microsoft C运行库 2009-03-04 10:27 973人阅读 评论(0) 收藏 举报 c语言librarydll编译器fortran 1.C运行库和C语言函数库 ...
- c语言程序设计资料书下载,C语言编程魔法书:基于C11标准 (陈轶著) 完整pdf高清版[20MB]...
C语言编程魔法书:基于C11标准主要讲解C11标准的语法内容,并且从整个编译.连接到加载过程都会涉及.同时在后会分别介绍GCC编译器与Clang编译器的C语言语法扩展.通过阅读本书,读者能够完全掌握新 ...
- python语言的第三方库_常用的Python第三方库
今天公司停电,没上班.跑上来更新个博客,跟大家分享一下我常用的几个第三方 Python 库.Python 语言之所以能够如此流行,除了本身内置许多程序库来保障快速开发之外,目不睱接的第三方库也是一大主 ...
- 全国计算机等级考试无纸化专用题库二级c语言答案,全国计算机等级考试真题汇编与专用题库二级C语言2017年无纸化考试专用...
内容提要 < 2017年 全国计算机等级考试真题汇编与专用题库 二级C语言>依据教育部考试中心新颁布的<全国计算机等级考试大纲>及新无纸化真考题库编写而成.本书内容充分考虑考生 ...
- 将标准 C++ 视为一个新语言
中午, 同事们都出去吃饭了. 无聊中去侯捷老师的网站上转了转,收获不小. 先挖出一篇文章来看看: 将标准 C++ 视为一个新语言 Learning Standard C++ as a New Lang ...
- 把标准C++视为一个新语言
http://ei.szpt.edu.cn/jjhou/programmer-4-learning-standard-cpp.htm 将标准 C++ 视为一个新语言 Learning Standard ...
- 无忧计算机c语言二级题库,干货for计算机等级考试题库:二级C语言试题
在这个天气炎热的季节,在这个洒满阳光的日子里,考无忧小编想悄悄告诉你:计算机二级考试很快就要开考了!!!赶紧刷计算机等级考试题库,刷二级C语言试题吧! 1.以下语句的输出结果是( ). int a=- ...
最新文章
- NLP深度学习:近期趋势概述
- kentico中自定义错误页面
- 整理一点关于Lucene的学习资料, 方便自己与别人查看
- LabviewRS232串口通信数据格式问题解析
- 教你理解复杂的C/C++声明
- 1.初次运行git前的配置
- Data Vault的一点思考(二)
- 记一次从代码审计到拿下内网edr的过程
- 大话重构7:重构是一系列的等量变换
- 虚拟化未来是I don’t care
- [转]打开人际关系大门的三把金钥匙
- 单片机c语言自学视频教程下载,郭天祥 十天学会单片机和C语言编程视频教程
- active控件和java脚本_Active控件问题小结(附解决办法)
- 四4层电梯三菱PLC程序带io表接线图
- 4月上旬国内域名商净增量Top10:联动天下跻身第10
- Java基础static关键字理解
- 最让IT技术支持人员头痛的10件事
- php中strtotime与mktime的Y2K38漏洞(时间最长为2038年)
- HTML打开QQ对话窗口
- 163个人邮箱如何注册申请?vip邮箱有哪些优点?
热门文章
- python 字符串转图片_python用base64库进行图片与字符串的转换
- IntelliJ IDEA中好用的插件 写代码必备
- 肺结节目标检测_四招识别肺结节的良恶性
- 【代码分解】用Python实现一个电影订票系统
- 离散数学之一 命题逻辑
- 出差!出差!!又是烦人的出差!!!奋斗史无奈暂缓更新~
- AirDisk产品Q3C体验
- Timer 源码解读 (2) TaskQueue 最小堆实现的优先队列
- Nvidia GeForce GT730不支持Pytorch 1.2.x GPU功能与可能解决办法及Pytorch各版本CUDA Capability兼容列表
- java毕业生设计药房药品采购集中管理系统计算机源码+系统+mysql+调试部署+lw