线程机制:
1.程序的执行路线
2.多线程程序
3.创建和销毁线程
4.互斥锁机制保证先线程间数据的安全共享
5.条件变量同步线程间的数据传输
6.传递多个参数给线程
线程对于函数就类似进程相对于程序。后者为前者提供了允许的环境
传统的程序只有一条单独的执行路径,就算包含goto语句及其递归子程序的程序也只有一条执行路线。
创建新的线程:pthread_reate
#include
int ret=pthread_create (pthread_t * thread,__const pthread_attr_t * attr,void *(* func) (void *),void *arg) __THROW __nonnull ((1, 3));
thread=指向pthread_t类型的指针
attr=指向pthread_attr_t 类型的指针,或者为NULL
func=指向新线程所允许函数的指针
arg=传递参数。
ret: 0=成功,负数=错误
func 函数原型:void *func(void *)
等待线程终止:pthread_join
#include
int ret=pthread_join (pthread_t thread, void **__thread_return);
thread=所等待的线程
__thread_return=指向某存储线程返回值的变量
ret:0=成功返回,错误码=错误
pthread_join 使得调用线程挂起直至由 thread 参数指定的线程终止 ,__thread_return 不是NULL, 线程的返回值存储在__thread_return 指向的变量中
当线程终止时,pthread_join 函数返回0, 如果由错误发生,则返回一个非零错误代码。
函数返回一个错误代码:
某线程试图等待一个并不存在的线程;
多个线程同时等待一个线程返回;
线程试图等待自己;
进程间可以通过管道,socket, 信息, 退出。等待 以及运行环境来进行会话。
线程在进程中指向,共享全局变量。
对共享内存的访问是线程一个有用又极为危险的特性。
互斥锁:任何数目的线程都可以挂起等待互斥量解锁
等待互斥解锁然后再锁住互斥量
#include
int ret=pthread_mutex_lock (pthread_mutex_t *__mutex)
__mutex=指向互斥锁对线的指针
ret:0=成功,其余=错误
给互斥量解锁
#include
int pthread_mutex_unlock (pthread_mutex_t *__mutex)
__mutex=指向互斥锁对线的指针
ret:0=成功,其余=错误
采用互斥锁会导致设置和释放互斥锁太多调用导致了系统性能的降低。
可以采用传递多个参数给某一线程中的函数。
进程的概念非常清晰且统一,而线程却有着一系列的起源,他们的属性也各不相同。
进程跟线程有根本上的不同,每个进程都有其独立的数据空间,文件描述符和进程ID。
线程共享一个数据空间,文件描述符和进程ID。
1)共享数据空间:一个线程malloc,另一个线程free。会导致内存指针错误。
线程机制会带来内存的囤积,只分配不释放存储区域,
静态局部变量的指针的函数无法兼容于多线程环境,
2)再多线程中,可能将同一个文件描述符传递给两个不同的线程
3)fork、exec、exit、Signals
所有的进程都共享同一个进程,如果一个线程调用了exec,系统内核用一个新的程序取代当前的程序从而所有正在运行的线程都会消失。
一个线程调用了exit,整个进程都会结束运行。
线程的运行导致了内存段异常或者系统错误,线程崩溃,瘫痪的是整个进程。
某个线程调用了fork,只有调用fork 的线程再新的进程中运行,
挂起线程,等待某条件变量的信号pthread_cond_wait
#include
int ret=pthread_cond_wait (pthread_cond_t * cond,pthread_mutex_t * mutex)
cond=指向某条件变量的指针
mutex=指向互斥锁对象的指针
ret:0=成功,其他=错误
pthread_cond_wait 总是和 互斥锁一起使用, pthread_cond_wait 先自动释放指定的锁,然后等待条件变量的变化。
如果再调用此函数前,互斥量 mutex 并没有被锁住,函数执行的结构是不确定。
函数返回前,此函数自动将指定的互斥量重新锁住。
唤醒一个正在等候的线程 pthread_cond_signal
#include
int ret=pthread_cond_signal (pthread_cond_t *cond )
cond =指向某条件变量的指针
ret:0=成功,其他=错误
pthread_cond_signal 通过 cond 发消息,没有线程等待,无事发生;多个线程都在等待,只唤醒其中的一个。、
独立线程:不需要返回的线程:传递一个特殊的属性参数给函数 pthread_create 来创建一个独立线程。