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,因 ...
随机推荐
- Daily Scrum 11.15
今日完成任务: 1.在回答页面显示用户的相关信息 2.重写了搜索方法,并在自己的Demo网站测试成功 3.修改问题实体属性,加入悬赏积分:并在问题列表页面显示问题悬赏分数 遇到困难:一个是对于学长的搜 ...
- 20172324《Java程序设计》第二周学习总结
20172324<Java程序设计>第2周学习总结 教材学习内容总结 了解了字符串及其拼接和转义序列的使用. Java的基本数据类型. 定义数据转换类型和实现其转换的方法. Scanner ...
- iOS开发学习-cocoapods的配置安装
安装coacoapods步骤: 在终端输入如下命令,升级ruby版本: sudo gem update —system 出现这个,标志着安装成功. 完成之后,再输入如下命令: gem sources ...
- Chapter 5 软件工程中的形式化方法
从广义上讲,形式化方法是指将离散数学的方法用于解决软件工程领域的问题,主要包括建立精确的数学模型以及对模型的分析活动.狭义的讲,形式化方法是运用形式化语言,进行形式化的规格描述.模型推理和验证的方法. ...
- 计算器简单封装和ASP.net
封装: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- 《软件工程和Python》第0周作业1
写在前面的话 欢迎大家开始一段新的课程学习!从开博客开始吧.每次博客作业都会有评分,计入总成绩哦. 1. 截止日期 本次作业的提交截止时间:见老师要求 2. 作业要求 (1)建立个人技术博客和 ...
- PAT 甲级 1142 Maximal Clique
https://pintia.cn/problem-sets/994805342720868352/problems/994805343979159552 A clique is a subset o ...
- ERROR 1698 (28000): Access denied for user 'root'@'localhost' 解决方法
之前MySQL服务端本机上使用密码登陆root账号是没有问题的,但是今天不知道是因为动了哪里,登陆失败并有这个错误代码: ~$ mysql -u root -p Enter password: ERR ...
- vmware 已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。
错误提示:已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. 此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态. 如果已在 BIOS/固件设置中禁用 ...
- mybaits入门(含实例教程和源码) http://blog.csdn.net/u013142781/article/details/50388204
前言:mybatis是一个非常优秀的存储过程和高级映射的优秀持久层框架.大大简化了,数据库操作中的常用操作.下面将介绍mybatis的一些概念和在eclipse上的实际项目搭建使用. 一.mybati ...