线程基础总结
一、线程:
①基础:线程是进程内部的线索,共享整个进程的资源,线程是雕塑的单位,是操作系统分配CPU时间的基本实体。当然,为利润提高系统性能,一些操作系统引入了轻量级的进程也被称作线程。
②优点:大大提高了任务一切换的效率;避免了额外的页表缓冲刷新。
二、多线程编程:
①pthread_create:
thread:创建的线程(使用pthread_t先定义变量,变量地址便是thread);
attr:指定线程的属性,一般使用NULL(用以表示缺省属性);
start_routine:线程执行的函数;
arg:传递给线程执行的函数的参数(即是执行函数的形参);
返回值:成功为0,出错为-1。
②pthread_join:(类似于wait())
retval:线程返回的参数;
thread:需要等待的线程;
返回值:成功:0,出错:-1。
③pthread_exit
retval:线程退出时的返回值;
返回值:成功:0,出错:-1。
④pthread_cancel:取消线程
thread:需要取消的线程
Example:
运行结果为:
程序在输出结果后一秒结束,该例主要是为了熟悉函数的使用。注意:在编译是,应加上pthread的链接。
三、Linux线程同步与互斥
①线程特点:
多线程共享同一个进程的地址空间;
线程之间的通信是很容易进行的(通过全局变量便可以实现数据共享和交换);
虽然通信方便,但是通信时,谁先读取数据,谁先写入数据这是一个问题;当正在写的时候读取或者读取的时候写入对数据的影响这也是一个问题,这里便存在着一个竟态(race condition)问题。所以在多线程同时访问共享对象的时候,需要引入同步和互斥的机制。
②同步:(P/V操作)
sem_init:
sem:初始化的信号量;
pshared:信号量共享的范围,一般为0;
value:信号量的初始值;
返回值:成功:0,出错:-1。
sem_wait:(P操作)
sem_post:(V操作)
下面的例子可帮助理解:
注意:编译的时候应加上pthread的链接。
③互斥(互斥锁):
目的:保证共享数据操作的完整性,保护共享(临界:写入读出之间)资源。
pthread_mutex_init():
mutex:使用pthread_mutex_t定义的变量;
attr:互斥锁的属性,一般为NULL;
解锁与上锁将通过一个例子进行解释