线程控制
来源:互联网 发布: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);}
- 线程控制
- 线程控制
- 线程控制
- 线程控制
- 线程控制
- 控制线程
- 线程控制
- 线程控制
- 控制线程
- 控制线程
- 线程控制
- 线程控制
- 线程控制
- 控制线程
- 线程控制
- 线程控制
- 线程控制
- 线程控制
- windows下启动openoffice服务
- 51Nod 1004 n^n的末位数字()
- 作业
- 37.List的foldLeft、foldRight、sort操作代码实战
- Caffe2新增RNN支持
- 线程控制
- 2016中国大学生程序设计竞赛(ccpc 长春) Fraction【模拟】
- 事务传播行为
- C语言笔记——一些小细节
- JavaScript数组去重方法
- Python-Redis操作
- android调试出现:Installation failed with message Failed to establish session
- 51Nod 1003 阶乘后面0的数量(后置0的个数)
- opensuse42.2和centos7设置开机进入命令行界面和切换命令行界面和图形界面