线程控制
1.线程:是系统调度的最小单位,没有自己的空间,它使用进程空间。执行:宏观并行,微观 串行。
2.Linux操作系统是允许多线程的,多线程的优点:
(1)节约时间,节约资源
(2)可以提高应用程序的响应速度;
(3)可以提高处理器效率;
(4)可以改善程序的结构
虽然线程在进程内部共享空间地址、打开的文件描述符资源等,但是线程也有其私有的数据信息,包括线程号(pthread ID)、寄存器、堆栈、信号掩码、优先级、线程私有的存储空间等。
3.线程的操作:
(1)int pthread_create(pthread_t thread,const pthread_attr_t *attr,void (*start_rtn)(*void), void *arg);
线程的创建
(2)pthread_t pthread_self();获取本线程的ID
(3)void pthread_exit(void *rval_ptr); 本线程终止,向主线程返回返回值 ==return
(4)int pthread_join(pthread_t thread, void **rval_ptr);主线程接受返回,阻塞等待子线程结束
(5)int pthread_equal(pthread_t tid1, pthread_t tid2); 判断两个线程ID是否指向同一线程
(6)int pthread_once();用来保证init_routine线程函数中仅执行一次
#inclued<stdio.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h> //pthread 成功返回0 其他失败
#include<sys/types.h>
void* haha(void* arg) //线程的返回
{
int i=0;
while(1)
{
for(i=0;i<3;i++)
{
sleep(2);
printf(" %d",(int)arg );
}
{}
return(void*)1000;
}
int mian()
{
pthread_t pthid=-1,pthid2=-1,pthid3=-1;
int renv=-1;
rev=pthread_create (&pthid,NULL,haha,(void*)10);
}
sleep()作用1.延时2.交出系统资源,sleep(0)让其他线程进入cpu使用
4.线程同步
线程同步最大的优点就是资源的共享性,然而资源共享中的同步问题是多线程编程的难点,Linux最常用的处理方式:互斥锁、条件变量、异步信号。
互斥锁:通过锁机制来实现线程间的同步。在同一时刻它只允许一个线程执行一个关键部分的代码
(1)int pthread_mutex_trylock() 尝试锁 失败返回-1
(2)int pthread_mutex_lock () 上锁如果上锁之前是被其他线程调用,那么就阻塞直到锁被释放
如果其他线程未上锁,那锁住mutex锁住,其他线程无法使用
(3)int pthread_mutex_destroy(&mlock) 销毁
(4)int pthread_mutex_unlock() 释放锁
条件变量:利用线程间共享的全局变量进行同一种机制
(1)pthread_cond_init() 初始化条件变量
(2)pthread_cond_wait() 基于条件变量阻塞,无条件等待
(3)pthread_cond_timedwait() 阻塞直到指定事件发生,计时等待
(4)pthread_cond_signal() 解除特定线程的阻塞
(5)pthread_cond_broadcast()解除所有线程的阻塞
(6)pthread_cond_destroy() 清除条件变量
异步信号:信号与任何线程都是异步的。
(1)int pthread_kill() 向特定的线程发送信号
(2)int pthread_sigmask() 设置线程的信号屏蔽码
(3)int sigwait() 阻塞线程
举例:互斥锁
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<stdio.h>
static char qidian[1024];
static pthread_cond_t contral;
static pthread_mutex_t conmutex;
void* wr(void *arg)
{
pthread_mutex_lock(&conmutex);
memset(qidian,0,1024);
strcpy(qidian,(char*)arg);
pthread_cond_broadcast(&contral);
pthread_mutex_unlock(&conmutex);
}
void *rd(void *arg)
{
pthread_cond_wait(&contral,&conmutex);
printf("neirong:%s",qidianl:);
}
void main()
{
pthreas_t sid=-1,rid1=-1,rid2=-1,rid3=-1;
pthread_cond_init(&contral,NULL); //条件初始化
pthread_mutex_init(&conmutex,NULL); //互斥锁初始化
pthread_cond_destroy(&contral);
pthread_mutex_destroy(&conmutex);
}