线程的几点优越性:
(1) 线程是有趣的。
线程类似于进程,线程是由内核时间分片进行管理的,
线程共享内存空间,不同的线程可以存取内存中的同一个变量,所以
不同线程可以读或写声明过的全局变量。只要利用简单的同步机制,所有线程就可以读写已有的数据结构。
(2) 线程是快捷的
线程的系统开销很小,内核无需单独复制进程的内存空间,文件描述符等等,这样就使得线程的创建速度比进程快好多倍,当然线程会利用多CPU。
(3) 线程是可移植的
线程的互斥:
如果两个线程分别对同一个变量进行修改,如果都要保存各自的修改结果,必须使用互斥锁,不然,由于线程的并发性,一个线程的修改会覆盖另外一个线程的修改。
在线程程序中pthread_mutex_lock();与pthread_mutex_unlock();的调用时必不可少的,他们提供了一种互斥的的方法,两个线程不能同时对同一个互斥对象枷锁。
互斥对象的工作流程:如果线程a试图锁定一个互斥对象,而此时线程b已经锁定了同一个互斥对象,则线程a将进入睡眠状态,一旦线程b释放了该互斥对象(调用函数pthread_mutex_unlock()),线程a就能锁定这个互斥对象了(调用函数pthread_mutex_lock()中返回)互斥对象被锁定,其他线程如果也想锁定这个互斥对象,也将会重复线程a的流程,换句话说,在同一时刻,只能有一个线程可以锁定这个互斥对象,确保同一时刻只有一个线程访问该数据结构,其他的线程将会被转入等待队列。可以推断出如果一个线程试图锁定一个未加锁的线程,POSIX线程库将同意被锁定,不会是线程进入睡眠状态。
线程的运行机制
线程内幕一:多线程是按照它的创建先后的顺序执行的。
线程内幕二:编译器有可能把互斥对象编译成一条机器指令(比如说赋值语句)
在这种情况下是不可能中断这个机器指令,即使硬件中断也不能,必须保证机器指令的完整性。