Linux多线程编程
IEEE POSIX 标准 (Pthreads) 定义了处理线程的一系列C 语言类型的API。
在Linux中,线程一般被认为是“轻量级的进程”。
Linux 创建进程所使用的函数是fork() 或者vfork()。而对线程的创建和管理Linux 可以使用POSIX的线程库pthreads提供的APIs。
使用fork()创建进程和使用POSIX线程库差别:
使用fork() 创建进程的特点:
代价昂贵,通常子进程需要拷贝父进程的整个上下文,比如数据等。
进程间的通信方式比较复杂,比如使用管道、消息、共享内存等方法。
操作系统在实现进程间的切换比线程切换更费时。
使用POSIX pthreads库创建线程的特点:
线程可使用存在于进程中的资源。
线程间的通信方式更容易,比如通过进程中的变量,可以让多个线程共享数据。
操作系统对线程的切换比对进程的切换更容易和快速。
Linux多线程编程
线程的创建
pthreads 线程库中提供的创建线程的函数是pthread_create()
#include <>
int pthread_create(pthread_t * thread, pthread_attr_t * attr,
void *(*start_routine)(void *), void * arg);
线程的退出
在线程的处理函数中,可以显示的调用pthread_exit()结束线程执行,也可以不调用pthread_exit(),而只是让线程处理程序返回。
void pthread_exit (void* retval);
除了pthread_exit() 函数,可以让当前调用pthread_exit() 的线程显示地退出外,线程也可以使用 pthread_cancel() 函数终止其他线程的执行。
int pthread_cancel(pthread_t thread);
等待线程结束
pthread_join() 函数会挂起创建线程的线程的执行,直到等待到想要等待的子线程。
int pthread_join(pthread_t th, void **thread_return);
线程的分离
主线程创建子线程,且子线程本身自己有自我回收内存资源的能力。
int pthread_detach(pthread_t th);
获得当前线程标志
使用pthread_self() 函数可以获得当前线程的标志,pthread_self() 的返回值就是当前线程的标志。
pthread_t pthread_self(void);
线程互斥和同步——Mutex
原子性。对mutex的加锁和解锁操作是原子的,一个线程进行 mutex 操作的过程中,其他线程不能对同一个 mutex 进行其他操作。
单一性。拥有mutex的线程除非释放mutex,否则其他线程不能拥有此mutex。
非忙等待。等待mutex的线程处于等待状态,直到要等待的mutex处于未加锁状态,这时操作系统负责唤醒等待此mutex的线程。
在POSIX线程库当中,存在三种类型的mutex
快速(fast)mutex
一个线程锁定了mutex,其他线程想要获得此mutex时,必须等待mutex处于未锁定状态
递归(recursive)mutex
已经拥有此mutex的线程可执行多次加锁操作,且不必等待mutex处于未加锁状态,但是对于其他线程,要想获得此mutex,必须等待此mutex处于未锁定状态
错误检测(error checking)mutex
当一个错误检测mutex已经被一个线程锁定时,其他线程想要锁定这个mutex,则锁定函数pthread_mutex_lock()函数将返回edeadlk值
POSIX 线程库对mutex提供了以下函数进行操作:
int pthread_mutex_init(pthread_mutex_t *mutex, const
pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
初始化mutex
pthread_mutex_t fastmutex=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex
多核程序设计Linux多线程编程 来自淘豆网m.daumloan.com转载请标明出处.