赞
踩
—一个进程创建的多个线程共享进程的地址空间。
—创建子进程是复制的父进程的地址空间(进程与进程间是独立的)
—同一程序中的所有线程都会执行相同的程序,且共享内存的内存段,包括数据段,堆区。(进程的栈区对线程不共享,每个线程都拥有属于自己的栈区)
—线程间的通信是通过操作共享的数据段实现的。(而进程所操作的地址空间都是独立的,因此进程之间的通信要引入进程的通信机制来实现。)
*Linux中引入同步互斥机制,从而保证某一个线程在操作共享资源时,不会被其他线程打扰。(即某一时刻,只有一个线程在对共享资源进行访问。)
ps axm(Linux可以看到进程的详细信息,可以看到–标识,就是线程)
ps ax -L(以Linux的形式查看进程和线程的关系)
pthread_create用于在进程中创建一个线程。
线程可用pthread_self来获取自己的ID。
线程的退出方式:
(1)线程的执行函数执行return语句并返回指定值。
(2)线程调用pthread_exit()函数。
(3)调用pthread_cancel()函数取消线程。
(4)任意线程调用exit()函数,或者main()函数中执行了return语句,都会造成进程中的所有线程立即终止。
若一个线程调用了pthread_exit()函数,但其他进程仍然继续执行。
pthread_cancel()函数向由 tid 指定的线程发送一个取消请求。发送取消请求后,函数pthread_cancel()立即返回,不会等待目标线程的退出。
若进程并未进行分离,则必须要用pthread_join函数来进行回收资源。
—线程间的通信访问了共享的进程数据段中的全局变量,(即并发的线程访问了相同的资源,所以造成了数据的不确定性),因此线程的通信要结合一些同步互斥机制一起使用。
线程加锁成功,则可以访问共享资源,期间不会被打断,在访问结束之后解锁
—先持有锁的进程先访问,其他进程只能阻塞等待。
—互斥锁并不能保证线程的执行先后,却可以保证对共享资源操作的完整性。
互斥锁的使用:
初始化互斥锁 互斥锁上锁 互斥锁解锁 互斥锁释放
只有当互斥锁处于未锁定状态,讲其摧毁才安全。
初始化之后,互斥锁处于未锁定状态。
如果该锁资源处于持有状态,那么调用此函数将会直接导致线程阻塞。
条件变量需要结合互斥锁一起使用。
条件变量:让当前不需要访问共享资源的线程进程阻塞等待(睡眠),如果某一时刻需要某一个线程处理,那么则可以将该线程进行唤醒。
条件变量也需要初始化 其核心操作是阻塞线程及唤醒进程,最后将其摧毁。
条件变量初始化:
条件变量摧毁:
条件变量阻塞等待:
条件变量唤醒:
信号量的工作原理:
—所有对共享资源操作的线程,在访问共享资源之前,都需要先操作信号量的值(即PV操作)。
P为申请信号量(-1),V为释放信号量(+1)。
当信号量的值为0时,申请信号量时将会阻塞,其值不能减为负数。
信号量:实现互斥时,多线程只需设置一个信号量;
实现同步时,需要设置多个信号量。
P : sem_wait()用来申请信号量,申请成功,信号量的值减1。(当信号量的值为0时,此操作将会阻塞,直到其他线程执行释放信号量)。
sem_trywait()函数不会阻塞,当信号量为0时,函数直接返回错误码EAGAIN.
V : sem_post()函数用来释放信号量,释放成功,信号量的值加1。
sem_getvalue()函数用来获取当前信号量的值,并保存在参数sval中。
sem_destroy()函数用来摧毁信号量。
—sem : 表示信号量的标识符。
创建线程的函数中,attr参数可设置线程的属性。
attr设置为NULL,则线程为默认属性。
一旦线程处于分离状态,就不能再使用pthread_join()函数来获取其状态。
----线程分离,也可以在线程刚一创建的时候就进行分离,(而不是之后再调用pthread_detach()函数)
----步骤:
1.采用默认方式对线程属性结构进行初始化。(pthread_attr_init)
2.为创建分离进程设置属性。(pthread_attr_setdetachstate)
3. 以此线程属性结构来创建新进程。(pthread_create)
4. 摧毁该线程属性结构。
设置取消线程属性
向一个线程发送一个请求,要求其立即退出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。