博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LINUX 线程
阅读量:6731 次
发布时间:2019-06-25

本文共 5589 字,大约阅读时间需要 18 分钟。

1、使用进程技术的优势

(1)CPU时分复用,单核心CPU可以实现宏观上的并行
(2)实现多任务系统需求(多任务的需求是客观的)
2、进程技术的劣势
(1)进程间切换开销大
(2)进程间通信麻烦而且效率低
3、解决方案就是线程技术
(1)线程技术保留了进程技术实现多任务的特性。
(2)线程的改进就是在线程间切换和线程间通信上提升了效率。
(3)多线程在多核心CPU上面更有优势。

 

使用线程解决键盘鼠标同时输入功能

#include 
#include
#include
#include
#include
#include
#include
#include
int fd = -1;char buf[100]; void *func(){ while(1) { memset(buf , 0, sizeof(buf)); printf("before 鼠标 \n"); read(fd , buf , 100); printf("鼠标读取的内容:[%s]\n" , buf); } } int main(){ int ret = -1; pthread_t th =-1 ; fd = open("/dev/input/mouse1", O_RDONLY); if(fd < 0) { perror("open"); exit(-1); } ret = pthread_create(&th ,NULL , func , NULL);//创建线程 if(ret != 0) { printf("pthread_create error \n"); return -1; } while(1) { memset(buf , 0, sizeof(buf)); printf("before 键盘 \n"); read(0 , buf , 100); printf("键盘读取的内容:[%s]\n" , buf); } return 0;}

 

线程简介

(1)一种轻量级进程
(2)线程是参与内核调度的最小单元
(3)一个进程中可以有多个线程

线程技术的优势

(1)像进程一样可被OS调度
(2)同一进程的多个线程之间很容易高效率通信
(3)在多核心CPU(对称多处理器架构SMP)架构下效率最大化

线程常见函数

1、线程创建与回收
(1)pthread_create 主线程用来创造子线程的
(2)pthread_join 主线程用来等待(阻塞)回收子线程
(3)pthread_detach 主线程用来分离子线程,分离后主线程不必再去回收子线程
2、线程取消
(1)pthread_cancel 一般都是主线程调用该函数去取消(让它赶紧死)子线程
(2)pthread_setcancelstate 子线程设置自己是否允许被取消
(3)pthread_setcanceltype
3、线程函数退出相关
(1)pthread_exit与return退出
(2)pthread_cleanup_push
(3)pthread_cleanup_pop

线程同步之信号量(线程等待信号唤醒)

#include 
#include
#include
#include
char buf[200];sem_t sem;int flag = 0;void *func( void * arg){ //子线程应被阻塞等待主线程激活 sem_wait(&sem); while(0==flag) { printf("本次输入了%d个字符\n",strlen(buf)); memset(buf , 0 ,sizeof(buf)); sem_wait(&sem); } pthread_exit(NULL);}int main(){ pthread_t th =-1 ; int ret = -1; sem_init(&sem,0, 0); ret = pthread_create(&th ,NULL , func , NULL);//创建线程 if(ret != 0) { printf("pthread_create error \n"); return -1; } printf("输入一个字符串回车结束\n"); while(scanf("%s",buf)) { if(0==strcmp("end",buf)) { printf("程序终止\n"); flag=1; sem_post(&sem); break; } //向子线程发送信号激活 //线程的同步问题 sem_post(&sem); } printf("准备回收\n"); ret = pthread_join(th,NULL); if(ret != 0) { printf("pthread_join error \n"); return -1; } sem_destroy(&sem); printf("回收结束\n"); return 0; }

线程同步之互斥锁 (线程被上锁后其他进程无法执行,等待解锁后才能执行其他进程)

#include 
#include
#include
#include
#include
char buf[200];int flag = 0;pthread_mutex_t mutex;void *func( void * arg){ //子线程应被阻塞等待主线程激活 sleep(1); while(0==flag) { pthread_mutex_lock(&mutex);//上锁 printf("本次输入了%d个字符\n",strlen(buf)); memset(buf , 0 ,sizeof(buf)); pthread_mutex_unlock(&mutex);//解锁 sleep(1); } pthread_exit(NULL);}int main(){ pthread_t th =-1 ; int ret = -1; pthread_mutex_init(&mutex, NULL); ret = pthread_create(&th ,NULL , func , NULL);//创建线程 if(ret != 0) { printf("pthread_create error \n"); return -1; } printf("输入一个字符串回车结束\n"); while(1) { pthread_mutex_lock(&mutex);//上锁 scanf("%s",buf); pthread_mutex_unlock(&mutex);//解锁 if(0==strcmp("end",buf)) { printf("程序终止\n"); flag=1; break; } sleep(1); } printf("准备回收\n"); ret = pthread_join(th,NULL); if(ret != 0) { printf("pthread_join error \n"); return -1; } printf("回收结束\n"); pthread_mutex_destroy(&mutex); return 0; }

线程同步之条件变量(等待某个条件被触发)

相关函数

pthread_cond_init pthread_cond_destroy
pthread_cond_wait pthread_cond_signal/pthread_cond_broadcast

#include 
#include
#include
#include
#include
char buf[200];int flag = 0;pthread_mutex_t mutex;pthread_cond_t cond;void *func( void * arg){ //子线程应被阻塞等待主线程激活 sleep(1); while(0==flag) { pthread_mutex_lock(&mutex);//上锁 pthread_cond_wait(&cond,&mutex); printf("本次输入了%d个字符\n",strlen(buf)); memset(buf , 0 ,sizeof(buf)); pthread_mutex_unlock(&mutex);//解锁 // sleep(1); } pthread_exit(NULL);}int main(){ pthread_t th =-1 ; int ret = -1; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond,NULL); ret = pthread_create(&th ,NULL , func , NULL);//创建线程 if(ret != 0) { printf("pthread_create error \n"); return -1; } printf("输入一个字符串回车结束\n"); while(1) { //pthread_mutex_lock(&mutex);//上锁 scanf("%s",buf); pthread_cond_signal(&cond); //pthread_mutex_unlock(&mutex);//解锁 if(0==strcmp("end",buf)) { printf("程序终止\n"); flag=1; break; } //sleep(1); } printf("准备回收\n"); ret = pthread_join(th,NULL); if(ret != 0) { printf("pthread_join error \n"); return -1; } printf("回收结束\n"); pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond); return 0; }

 

转载于:https://www.cnblogs.com/PengfeiSong/p/6565315.html

你可能感兴趣的文章
自己动手开发一个Android持续集成工具-简介
查看>>
RGB、HSL、Hex网页色彩码,看完这篇全懂了
查看>>
展与会融合渐成会展业新趋势
查看>>
grafana 添加zabbix数据源
查看>>
Vue之全选,计算属性computed,实战
查看>>
element ui 分页请求和操作提示的封装
查看>>
门面模式就是这么简单
查看>>
冷知识:web打印分页,支持浮动
查看>>
Python程序包的构建和发布过程
查看>>
聊聊flink的FencedAkkaInvocationHandler
查看>>
浅谈promise与异步编程
查看>>
利用python检查QQ好友的空间是否对你有限制
查看>>
JSONP的历史方案和实现原理
查看>>
Xcode警告的那些事儿
查看>>
Python丨给你的爬虫代码里面添加一些小功能,让你的代码与众不同
查看>>
centos下安装nginx、jdk、tomcat、域名绑定解析 过程记录
查看>>
用GitLab搭建自己的私有GitHub
查看>>
YUM软件管理
查看>>
Mongodb中经常出现的错误:child process failed, exited with error number
查看>>
我的友情链接
查看>>