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 线程的更多相关文章

  1. [转载]Linux 线程实现机制分析

    本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...

  2. linux线程的实现

    首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用 ...

  3. linux线程的实现【转】

    转自:http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个 ...

  4. Linux线程-创建

    Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...

  5. Linux线程学习(一)

    一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...

  6. Linux线程学习(二)

    线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换   线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...

  7. Linux 线程(进程)数限制分析

    1.问题来源公司线上环境出现MQ不能接受消息的异常,运维和开发人员临时切换另一台服务器的MQ后恢复.同时运维人员反馈在出现问题的服务器上很多基本的命令都不能运行,出现如下错误:2.   初步原因分析和 ...

  8. Linux 线程与进程,以及通信

    http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...

  9. linux 线程的内核栈是独立的还是共享父进程的?

    需要考证 考证结果: 其内核栈是独立的 206 static struct task_struct *dup_task_struct(struct task_struct *orig) 207 { 2 ...

  10. Linux 线程模型的比较:LinuxThreads 和 NPTL

    Linux 线程模型的比较:LinuxThreads 和 NPTL GNU_LIBPTHREAD_VERSION 宏 大部分现代 Linux 发行版都预装了 LinuxThreads 和 NPTL,因 ...

随机推荐

  1. Last Daily Scrum (2015/11/9)

    今晚我们终于完成了新版本的爬虫工作,可以替换掉之前部署在服务器上的那个爬虫了.由于周末大家各种原因导致了我们迭代一的截止日没有完成所有任务,所以今天晚上大家加班加点终于把这一迭代的爬虫项目完成了. 成 ...

  2. 2017-2018-1 Java演绎法 第九、十周 作业

    团队成员 [20162315 马军] [20162316 刘诚昊] [20162317 袁逸灏(组长)] [20162319 莫礼钟] [20162320 刘先润] [20162330 刘伟康] 项目 ...

  3. ASP.NET MVC5 学习系列之初探MVC

    一.由问题看本质 (一)什么是MVC? MVC是Model-View-Controller的简称.它是在1970年引入的软件设计模式.MVC 模式强迫关注分离 — 域模型和控制器逻辑与UI是松耦合关系 ...

  4. VMware上配置DPDK环境并运行实例程序

    1. 在虚拟机VMware上配置环境 VMware安装:http://www.zdfans.com/html/5928.html Ubuntu:https://www.ubuntu.com/downl ...

  5. 【区间DP】codevs3657 括号序列题解

    题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...

  6. ns3 回调机制

    (1)目的:为了实现两个模块之间的通信(这两个模块没有任何依赖关系) (2) C语言中的函数指针 int (*a)(int q) = 0; //声明一个函数指针a,初始值设为0 //. //. //. ...

  7. Eclipse+MySQL+Tomcat web开发安装配置

    转载文章: 链接:https://blog.csdn.net/bbyyz01/article/details/78142126 1.Eclipse 这里选择Eclipse集成开发环境. 可以直接在官网 ...

  8. beta 发布的相关评论

    1. 礼物挑选小工具 飞天小女警      这个项目的创意独具匠心,贴近实际,令人耳目一新,网站的页面也是玫红色的,配色让人感到很温馨,对礼物的筛选方式很有趣,使用的记录特殊日子的方法来提醒自己挑选礼 ...

  9. PAT 1147 Heaps

    https://pintia.cn/problem-sets/994805342720868352/problems/994805342821531648 In computer science, a ...

  10. selenium使用execl实现数据驱动测试

    import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.uti ...