线程控制

来源:互联网 发布:matlab求解非线性优化 编辑:程序博客网 时间:2024/06/07 15:40

线程控制
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);}