多线程编程——pthread
1 创建线程
1.1 原型
#include <pthread.h>int pthread_create(pthread_t *tid, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
1.2 功能
创建一个线程
新线程从start_routine开始执行
新线程的ID保存在tid指向的位置
1.3 参数
参数 | 功能 |
---|---|
tid | 该参数是一个指针, 新线程的ID保存在tid指向的位置 |
attr | 线程属性。如果为空,则使用缺省的属性值 |
start_routine | 该参数是一个函数指针, 新线程从start_routine开始执行 |
1.4 返回值
如果成功,返回0
如果失败,返回非0
1.5 例子
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>// int pthread_create(pthread_t *tid, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
void *compute(void *arg)
{char i;for (i = 'a'; i < 'd'; i++) {printf("worker: %c\n", i);sleep(1);}return NULL;
}int main()
{ pthread_t worker_tid;pthread_create(&worker_tid, NULL, &compute, NULL);char i;for (i = 'A'; i < 'D'; i++) { printf("master: %c\n", i);sleep(1);}return 0;
}
2 参数类型
参数类型
可以向线程入口函数传递任意类型的参数
整型变量
long ivalue = 123;
void *arg = (void *) ivalue;
pthread_create(&tid, NULL, start_routine, arg);字符串变量
char *svalue = "string";
void *arg = (void *) svalue;
pthread_create(&tid, NULL, start_routine, arg);结构体变量,只能传递结构体的地址
struct person {char *name; int age;
} p;
void *arg = (void *) &p;
pthread_create(&tid, NULL, start_routine, arg);
2.1 传int类型
- 进行相应的类型转换
int类型转换到void*存在size不一样的问题
pthread_create(&worker_tid, NULL, &compute2, (void *)100);
解决:用lnog int 类型
pthread_create(&worker_tid, NULL, &compute2, (void *)(long int)100);
void *compute2(void *arg)
{long num = (long int)arg;int i;for (i = 0; i < 3; i ++){printf("i=%d, num=%ld\n", i, num);sleep(1);}return NULL;
}int main()
{long ivalue = 100;pthread_t worker_tid;
// pthread_create(&worker_tid, NULL, &compute, "worker");pthread_create(&worker_tid, NULL, &compute2, (void *)ivalue);compute2((void*)(long int)(200));return 0;
}
将ivalue定义为long 类型,注意: long类型强制类型转换需要用(long int)
- 或者传指针
void *compute3(void *arg)
{int *num = (int *)arg;int i;for (i = 0; i < 3; i ++){printf("i=%d, num=%d\n", i, *num);sleep(1);}return NULL;
}int main()
{long ivalue = 100;pthread_t worker_tid;
// pthread_create(&worker_tid, NULL, &compute, "worker");
// pthread_create(&worker_tid, NULL, &compute2, (void *)ivalue);pthread_create(&worker_tid, NULL, &compute3, (void *)&ivalue);compute2((void*)(long int)(200));return 0;
3 等待线程
3.1等待线程
3.1.1原型
#include <pthread.h>int pthread_join(pthread_t tid, void **result);
3.1.2 功能
等待线程结束
3.1.3 参数
tid 目标线程的ID
result 用于存放线程的计算结果
3.1.4 返回值
如果成功,返回0
如果失败,返回非0
3.2 线程返回值
线程入口函数返回类型为void **类型的结果
void *start_routine(void *arg)
{void *result; //返回多个可用结构体类型result = malloc(……);...return result;
}等待线程函数pthread_join获取线程的返回结果
void *result;
pthread_join(tid, &result);
https://blog.csdn.net/weixin_43587255/article/details/105741997
线程返回时有如下注意点:线程函数中指针需要申请分配空间,如果不分配,其将指向一个局部变量,函数调用完释放,造成指针悬挂,指向不确定的地方
多线程编程——pthread相关推荐
- linux 多线程 semaphore ,Linux下多线程编程-Pthread和Semaphore使用.doc
比锄戴垒丛共麦溺庄哆氏葫季袒飞闲棉铆稼椰悲倘寓矩案铺汞嫡懂伸腑箩五穗颗撩护尚巷苯宅瑚铱焕涅职枝怎摔什街杠写冻泡峡蠢舀以咽铝皇篮糠村墟凤帜攒摧定畜遁陛葛杯复妄婚赣续踌肖祷就抖帘荒徘魂圭焙酸劈待钞林讯啊铂 ...
- Pthread多线程编程之查看Pthread版本的方法
Pthread多线程编程之查看Pthread版本的方法: getconf GNU_LIBPTHREAD_VERSION [root@localhost Workspace]# getconf GNU_ ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 -- DevStore p ...
- 【C/C++多线程编程之十】pthread线程私有数据
多线程编程之线程私有数据 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 线程同步从互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编 ...
- 【C/C++多线程编程之九】pthread读写锁
多线程编程之读写锁 Pthread是 POSIX threads 的简称,是POSIX的线程标准. pthread读写锁把对共享资源的访问者分为读者和写者,读者只对共享资源进行读访问,写者只对共享资源 ...
- 【C/C++多线程编程之八】pthread条件变量
多线程编程之条件变量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥机制,包括互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程 ...
- 【C/C++多线程编程之七】pthread信号量
多线程编程之信号量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥量用来处理一个共享资源的同步访问问题,当有多个共享资源时,就需要用到信号量机制. 信号量机制用于 ...
- 【C/C++多线程编程之六】pthread互斥量
多线程编程之线程同步互斥量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. Pthread线程同步指多个线程协调地,有序地同步使用共享资源.[C/C++多线程编程之五] ...
- 【C/C++多线程编程之五】pthread线程深入理解
多线程编程之pthread线程深入理解 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 前几篇博客已经能给你初步的多线程概念,在进一步学习线程同步等多线程核心知识之前, ...
- 【C/C++多线程编程之四】终止pthread线程
多线程编程之终止pthread线程 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 终止线程似乎是多线程编程的最后一步,但绝不是本系列教材的结束.线 ...
最新文章
- Linux之远程登录、远程拷贝命令 ssh scp
- 简单实用的php分页类(多种分页方式)
- 使用Javascript制作连续滚动字幕
- 便携式不锈钢管道焊接机器人_不锈钢管道焊接工艺
- Redis持久化(RDB 和 AOF)
- 马斯克刚骂了激光雷达,这篇用纯视觉代替激光雷达的名校论文「力挺」了他...
- Spring Autowiring @Qualifier example
- vue本地静态图片的路径问题解决方案
- 设计模式详解(链接)
- 微信小程序实例源码大全下载
- FastDFS的安装及上传下载(二)
- (20200108)matlab弹出对话框形式打开和读取指定文件,不用提前输入文件名——uigetfile
- LIS3DH运动检测调试过程
- 葫芦娃手游服务器未响应,葫芦娃混服S453无动于衷开服时间表_葫芦娃新区开服预告_第一手游网手游开服表...
- Android蓝牙通信
- 使用echarts生成漂亮的3D地图
- WinBUGS对多元随机波动率模型:贝叶斯估计与模型比较
- vs2019开发android应用,VS 2019开发APP(一)界面和代码
- 仿照QQ的左右滑动切换界面的效果
- 如何根据选股条件选择基本面量化股票池?