14 多线程编程

这里所指的线程是POSIX线程(简称pthread)

线程同步方式:POSIX信号量、互斥锁、条件变量

根据运行环境和调度者身份,线程可分为内核线程和用户线程

 

创建线程和结束线程

 1 #include <pthread.h>
 2 int pthread_create(pthread_t* thread, const pthread_attr_* attr, void* (*start_routine)(void*), void* arg);    //创建线程
 3 int pthread_exit(void* retval);    //退出线程
 4 
 5 //一个进程中的所有线程都可以调用pthread_join函数来回收其他线程,即等待其他线程结束
 6 int pthread_join(pthread_t thread, void** retval);    
 7 
 8 
 9 //有时候我们希望异常终止一个线程,即取消线程
10 int pthread_cancel(pthread_t thread);
11 
12 //目标线程可以决定是否允许被取消以及如何取消,这分别由如下两个函数完成:
13 int pthread_setcancelstate(int state, int* oldstate);
14 int pthread_setcanceltype(int type, int* oldtype);

 

线程属性

pthread_attr_t 结构体定义了一套完整的线程属性

#include <bits/pthreadtypes.h>
#define __SIZEOF_PTHREAD_ATTR_T 36
typedef union{
    char __size[__SIZEOF_PTHREAD_ATTR_T];
    long int __align;
}pthread_attr_t;

 

POSIX信号量

 

互斥锁

#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* mutexattr);
int pthread_mutex_destroy(pthread_mutex_t* mutex);
int pthread_mutex_lock(pthread_mutex_t* mutex);
int pthread_mutex_trylock(pthread_mutex_t* mutex);
int pthread_mutex_unlock(pthread_mutex_t* mutex);

 

条件变量

线程间同步共享数据的值,条件变量提供了一种线程间的通知机制:当某个共享数据达到某个值的时候,唤醒等待这个共享数据的线程

1 int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* cond_attr);
2 int pthread_cond_destroy(pthread_cond_t* cond);
3 int pthread_cond_broadcast(pthread_cond_t* cond);
4 int pthread_cond_signal(pthread_cond_t* cond);
5 int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);

 

多线程环境

可重入函数:如果一个函数能被多个线程同时调用且不发生竞态条件,则我们称它是线程安全的,或说它是可重入函数。linux库函数只有一小部分是不可重入的。这些库函数之所以不可重入,主要是因为其内部使用了静态变量。不可重入库函数的可重入版本是在原函数名尾部加上 _r。

 

posted on 2015-12-11 15:25  已停更  阅读(273)  评论(0编辑  收藏  举报