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,因 ...
随机推荐
- java程序设计第二次实验报告
北京电子科技学院(BESTI) 实验报告 课程:数据结构 班级:1352 姓名:何伟钦 学号:20135223 成绩: 指导教师:娄嘉鹏 实验日期: ...
- 实验1 熟悉Linux开发环境 实验报告
参见http://www.cnblogs.com/lhc-java/p/4970269.html
- 05慕课网《进击Node.js基础(一)》HTTP概念进阶(同步/异步)
HTTP模块介绍 支持http协议的更多特性 不缓存请求和响应 API比较底层处理流相关,信息解析 HTTP相关概念 回调 将函数作为参数传到执行函数中,参数函数在执行函数中嵌套执行 function ...
- Hibernate笔记④--一级二级缓存、N+1问题、saveorupdate、实例代码
一级缓存及二级缓存 一级缓存也是Session 缓存 一个链接用户的多次查询使用缓存 跨用户 则无缓存 hibernate自带的 get和load都会填充并利用一级缓存 二级缓 ...
- MAVEN教程--01安装|创建|解释
Maven是一个采用纯Java编写的开 源项目管理工具.Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xm ...
- 【图论】POJ-3255 次短路径
一.题目 Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her ...
- 【CSAPP笔记】7. 汇编语言——过程调用
一个过程调用包括将数据(以参数和返回值的形式)与控制从代码的一部分传递到另一部分.除此之外,在进入时为过程的局部变量分配空间,在退出的时候释放这些空间.数据传递.局部变量的分配和释放通过操纵程序栈来实 ...
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char ...
- python基础(二)条件判断、循环、格式化输出
继续上一篇,今天主要总结一下条件判断.循环.格式化输出 一.条件判断 python中条件判断使用if else来判断,多分支的话使用if elif ... else,也就是如果怎么怎么样就怎么怎么样, ...
- c3p0连接池基本配置mysql和oracle
c3p0-config.xml <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> ...