线程
线程的概念:线程是进程内部的一条执行序列(执行流),每个进程至少有一条执行序列:main的执行体。进程可以通过线程库创建N条线程,这些新创建的线程称之为线程函数,main函数所代表的线程为主线程。
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。它的执行需要系统分配资源创建实体之后,才运行。
线程与进程的区别:
-
进程是资源分配的最小单位,线程是cpu调度的最小单位。
-
线程是轻量级的进程
-
管理方式不同,进程时PCB管理,线程是由线程结构管理。
线程间同步的控制方式:
1.信号量:线程的信号量与进程间通信中使用的信号量的概念是一样的, 只是线程同步是控制线程执行和访问临界区域的方法。
获取或创建:
Int sem_init(sem_t*sem,intshared,int value);
P 操作: int sem_wait(sem_t *sem);
V 操作: int sem_post(sem_t*sem);
删除: intsem_destroy(sem_t * sem);
2.互斥锁:
概念:完全控制临界资源,如果一个线程完成加锁状态,则其他线程无论如何都将无法在完成加锁,也就是无法对临界资源进行访问。
就像使用打印机打印东西时,别人刚好也打印,如果不做处理的话,打印出来的东西肯定错乱。因此需要互斥锁来解决。
初始化:
Int pthread_mutex_lock(pthread_mutex_t*mutex,
pthread_mutex_arr_t * attr);
加锁:
intpthread_mutex_lock(pthread_mutex_t*mutex);//阻塞
int pthread_mutex_trylock(pthread_mutex_t*mutex);//非阻塞
解锁: intpthread_mutex_unlock(pthread_mutex_t*mutex);
释放: Intpthread_mutex_destroy(pthread_mutex_t*mutex);
3.条件变量:
概念:条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待条件变量的条件成立而挂起,另一个线程使条件成立(给出条件成立信息),为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。
静态创建:
Pthread_cond_t cond =PTHREAD_COND_INITALIZER;
动态创建:
Int pthread_cond_init(pthread_cond_t*cond,
pthread_condattr_t*cond_attr);
注销:
Int pthread_cond_destroy(pthread_cond_t*cond);
头文件为:#include<pthread.h>;
信号量与互斥锁的区别:
信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后在进行自己的下面的操作,这个任务不一定是锁定某一资源,还可以是进行一些计算会处理数据之类。而线程互斥量则是锁住某一资源的概念,在锁定期间其他线程无法对被保护的数据进行操作。