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 ; }