1、线程初始化 pthread_create()
pthread_create(pthread_t *thread , const pthread_attr_t *attr, void *
(start_routine)(void*), void *arg);
thread -线程ID
attr -- 线程属性(涉及线程多大空间 之类的)
void * 无属性 线程的函数真正的回调函数
arg 线程的参数
2、线程ID的获取
如上述函数 可以通过 create获取 也可以 pthread_self()
在线程里直接打印即可,类似 子进程 父进程 打印PID (pid = getpid())
3、线程退出
线程退出 分隐式 或其他线程指示退出
线程自己运行完 会自己调用pthread_exit ()这也就是和return的区别 return 只代表了一个函数的推出 而exit代表线程资源的释放以及资源的回收
pthread_cance (pthread_t thread) ;
在某线程中调用此函数,可以终止由参数thread 指定的线程
等待线程退出
如果一个线程要等待另一个线程的终止,可以使用pthread_join函数,该函数的作用是调用pthread_join的线程将被挂起直到线程ID为参数thread的线程终止:
pthread_join (pthread_t thread, void** threadreturn); turn 一般为NULL 为何要使用线程jion
a、用于等待其他线程结束:当调用 pthread_join() 时,当前线程会处于阻塞状态,直到被调用的线程结束后,
当前线程才会重新开始执行。
b、对线程的资源进行回收:如果一个线程是非分离的(默认情况下创建的线程都是非分离 值得线程属性)
并且没有对该使用 pthread_join() 的话,该线程结束后并不会释放其内存空间,这会导致该线程变成了“僵尸线程
c、线程一直存在,接受线程序退出处理程序的结果
d、如线程函数中自己调用pthread_exit("hello pthread"); //退出时 把hello pthread 的信息传给了pthread_join
4、线程通信
a.线程互斥锁,线程中互斥锁的作用主要是保证共享资源可以按照想要的同步方式获取 例如 线程A获取了 变量A 并且将变量A+1,此时线程B也正在获取变量A 如果不加锁控制 那么其实B线程想获得变量A+1后的结果,但可能会获变量A的值,未达到期待
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL); //按缺省的属性初始化互斥体变量mutex
pthread_mutex_lock(&mutex); // 给互斥体变量加锁
phtread_mutex_unlock(&mutex); // 给互斥体变量解除锁
b.线程同步, 同步就是线程等待某个事件的发生。只有当等待的事件发生线程才继续执行,否则线程挂起并放弃处理器。当多个线程协作时,相互作用的任务必须在一定的条件下同步。
线程同步机制,最典型的是使用条件变量(condition variable)。pthread_cond_init用来创建一个条件变量,其函数原型为:
pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr);
cond 就是我们的条件变量 不过目前初始化条件变量的 都用了 pthread_cond_t cv = PTHREAD_COND_INITIALIZER;替代了 两个的区别就是 一个是静态获取 一个是动态获取
c.线程条件等待
如何将条件变量与线程连接,我们需要使用pthread_cond_wait这个接口
pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);
这个Mutex就是互斥锁 我们等待的前提是mutex必须在上锁状态,这是为了防止在真正进入等待状态之前别的线程有可能设置该条件变量而产生竞争。(待wait调用后,线程挂起后 ,在解锁Mutex, 此时线程的条件变量是锁住的 但是Mutex锁已解锁释放给其他线程调用)
pthread _mutex_lock(&mutex)
while或if(线程执行的条件是否成立)
pthread_cond_wait(&cond, &mutex);
线程执行
pthread_mutex_unlock(&mutex);
d.线程唤起
pthread_cond_broadcast (pthread_cond_t *cond) ;
pthread_cond_signal (pthread_cond_t *cond) ;
区别在于 pthread_cond_signal则用于解除某一个等待线程的阻塞状态,pthread_cond_broadcast 解除所有线程阻塞状态