LINUX 线程
1、使用进程技术的优势
(1)CPU时分复用,单核心CPU可以实现宏观上的并行
(2)实现多任务系统需求(多任务的需求是客观的)
2、进程技术的劣势
(1)进程间切换开销大
(2)进程间通信麻烦而且效率低
3、解决方案就是线程技术
(1)线程技术保留了进程技术实现多任务的特性。
(2)线程的改进就是在线程间切换和线程间通信上提升了效率。
(3)多线程在多核心CPU上面更有优势。
使用线程解决键盘鼠标同时输入功能
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
int fd = -;
char buf[];
void *func()
{
while()
{
memset(buf , , sizeof(buf));
printf("before 鼠标 \n");
read(fd , buf , );
printf("鼠标读取的内容:[%s]\n" , buf);
} }
int main()
{
int ret = -;
pthread_t th =- ; fd = open("/dev/input/mouse1", O_RDONLY);
if(fd < )
{
perror("open");
exit(-);
} ret = pthread_create(&th ,NULL , func , NULL);//创建线程
if(ret != )
{
printf("pthread_create error \n");
return -;
}
while()
{
memset(buf , , sizeof(buf));
printf("before 键盘 \n");
read( , buf , );
printf("键盘读取的内容:[%s]\n" , buf);
} return ;
}
线程简介
(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 <stdio.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h> char buf[];
sem_t sem;
int flag = ;
void *func( void * arg)
{
//子线程应被阻塞等待主线程激活
sem_wait(&sem);
while(==flag)
{
printf("本次输入了%d个字符\n",strlen(buf));
memset(buf , ,sizeof(buf));
sem_wait(&sem);
} pthread_exit(NULL);
}
int main()
{ pthread_t th =- ;
int ret = -;
sem_init(&sem,, );
ret = pthread_create(&th ,NULL , func , NULL);//创建线程
if(ret != )
{
printf("pthread_create error \n");
return -;
}
printf("输入一个字符串回车结束\n");
while(scanf("%s",buf))
{
if(==strcmp("end",buf))
{
printf("程序终止\n");
flag=;
sem_post(&sem);
break;
}
//向子线程发送信号激活
//线程的同步问题
sem_post(&sem);
}
printf("准备回收\n");
ret = pthread_join(th,NULL);
if(ret != )
{
printf("pthread_join error \n");
return -;
}
sem_destroy(&sem);
printf("回收结束\n");
return ; }
线程同步之互斥锁 (线程被上锁后其他进程无法执行,等待解锁后才能执行其他进程)
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h> char buf[];
int flag = ;
pthread_mutex_t mutex;
void *func( void * arg)
{
//子线程应被阻塞等待主线程激活
sleep();
while(==flag)
{
pthread_mutex_lock(&mutex);//上锁
printf("本次输入了%d个字符\n",strlen(buf));
memset(buf , ,sizeof(buf));
pthread_mutex_unlock(&mutex);//解锁
sleep();
} pthread_exit(NULL);
}
int main()
{ pthread_t th =- ;
int ret = -;
pthread_mutex_init(&mutex, NULL);
ret = pthread_create(&th ,NULL , func , NULL);//创建线程 if(ret != )
{
printf("pthread_create error \n");
return -;
}
printf("输入一个字符串回车结束\n");
while()
{
pthread_mutex_lock(&mutex);//上锁
scanf("%s",buf);
pthread_mutex_unlock(&mutex);//解锁
if(==strcmp("end",buf))
{
printf("程序终止\n");
flag=;
break;
}
sleep();
}
printf("准备回收\n");
ret = pthread_join(th,NULL);
if(ret != )
{
printf("pthread_join error \n");
return -;
}
printf("回收结束\n");
pthread_mutex_destroy(&mutex);
return ; }
线程同步之条件变量(等待某个条件被触发)
相关函数
pthread_cond_init pthread_cond_destroy
pthread_cond_wait pthread_cond_signal/pthread_cond_broadcast
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h> char buf[];
int flag = ;
pthread_mutex_t mutex;
pthread_cond_t cond;
void *func( void * arg)
{
//子线程应被阻塞等待主线程激活
sleep();
while(==flag)
{
pthread_mutex_lock(&mutex);//上锁
pthread_cond_wait(&cond,&mutex);
printf("本次输入了%d个字符\n",strlen(buf));
memset(buf , ,sizeof(buf));
pthread_mutex_unlock(&mutex);//解锁
// sleep(1);
} pthread_exit(NULL);
}
int main()
{ pthread_t th =- ;
int ret = -;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond,NULL);
ret = pthread_create(&th ,NULL , func , NULL);//创建线程 if(ret != )
{
printf("pthread_create error \n");
return -;
}
printf("输入一个字符串回车结束\n");
while()
{
//pthread_mutex_lock(&mutex);//上锁
scanf("%s",buf);
pthread_cond_signal(&cond);
//pthread_mutex_unlock(&mutex);//解锁
if(==strcmp("end",buf))
{
printf("程序终止\n");
flag=;
break;
}
//sleep(1);
}
printf("准备回收\n");
ret = pthread_join(th,NULL);
if(ret != )
{
printf("pthread_join error \n");
return -;
}
printf("回收结束\n");
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return ; }
LINUX 线程的更多相关文章
- [转载]Linux 线程实现机制分析
本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...
- linux线程的实现
首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用 ...
- linux线程的实现【转】
转自:http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个 ...
- Linux线程-创建
Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...
- Linux线程学习(一)
一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...
- Linux线程学习(二)
线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换 线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...
- Linux 线程(进程)数限制分析
1.问题来源公司线上环境出现MQ不能接受消息的异常,运维和开发人员临时切换另一台服务器的MQ后恢复.同时运维人员反馈在出现问题的服务器上很多基本的命令都不能运行,出现如下错误:2. 初步原因分析和 ...
- Linux 线程与进程,以及通信
http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...
- linux 线程的内核栈是独立的还是共享父进程的?
需要考证 考证结果: 其内核栈是独立的 206 static struct task_struct *dup_task_struct(struct task_struct *orig) 207 { 2 ...
- Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程模型的比较:LinuxThreads 和 NPTL GNU_LIBPTHREAD_VERSION 宏 大部分现代 Linux 发行版都预装了 LinuxThreads 和 NPTL,因 ...
随机推荐
- Scrum Meeting 8 -2014.11.14
给开发加了个pdf信息提取优化任务. 弄了半天发现服务器也是个好东西.这周末可以和爬虫讨论整合的问题了. Member Today’s task Next task 林豪森 协助测试及服务器部署 协助 ...
- 2-Eighth Scrum Meeting20151208
任务分配 闫昊: 今日完成:和唐彬讨论研究上届的网络接口代码. 明日任务:商讨如何迁移ios代码到android平台. 唐彬: 今日完成:和闫昊讨论研究上届的网络接口代码. 明日任务:商讨如何迁移io ...
- 20135313-exp1
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:吴子怡 学号:20135313 成绩: 指导教师:娄嘉鹏 实 ...
- java程序设计课程实验报告1
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:陈都 学号:20135328 成绩: 指导 ...
- 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结
20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...
- 浅谈对IT的认识!
我是一个从农村出来的学生,家里的情况和大多数的农村同学是一样的,家里算不上有钱,父母供我读书,也已经是做到仁至义尽了. 我现在选了,一个和计算机有关的专业---计算机应用技术.就是希望毕业后,可以找到 ...
- excel的常用技巧
如何将EXCEL表中SHEET的名字导出 (一)office的操作方法 按下ATL+F11 菜单:插入-模块 复制下面代码,然后按F5运行.会在最前面加张总表,显示工作表名称. Sub mulu( ...
- Js 中的原始值和引用值
最近遇写 node.js 时到一个问题,把对象当赋值给数组成员时总是出错,比如下面的代码, var Arr = new Array(); var Obj = new Object(); for(var ...
- 笔记之分布式文件系统(DFS)
不知何故,老外都挺喜欢使用DFS,但是国内公司用这个的不多.一个具体的需求就是,备份服务器在国外,所以启用DFS把国内的数据同步一份到国外进行备份.最近有机会接触DFS,把一些心得体会记录一下. 1. ...
- [微软官方]FSUTIL
Applies To: Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7, Windows Server 2003 ...