background image

  (2)由线程本身显示调用 pthread_exit 函数退出;

pthread_exit (void * retval) ;

  (3)被其他线程用 pthread_cance 函数终止:

pthread_cance (pthread_t thread) ;

  在某线程中调用此函数,可以终止由参数 thread 指定的线程。

  如果一个线程要等待另一个线程的终止,可以使用 pthread_join 函数,该函数的作
用是调用 pthread_join 的线程将被挂起直到线程 ID 为参数 thread 的线程终止:

pthread_join (pthread_t thread, void** threadreturn);

3.线程通信

  线程互斥

  互斥意味着 排它 ,即两个线程不能同时进入被互斥保护的代码。Linux 下可以通过
pthread_mutex_t 定义互斥体机制完成多线程的互斥操作,该机制的作用是对某个需要互

斥的部分,在进入时先得到互斥体,如果没有得到互斥体,表明互斥部分被其它线程拥
有,此时欲获取互斥体的线程阻塞,直到拥有该互斥体的线程完成互斥部分的操作为止。

  下面的代码实现了对共享全局变量 x 用互斥体 mutex 进行保护的目的:

int x; // 进程中的全局变量
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL); //按缺省的属性初始化互斥体变量 mutex
pthread_mutex_lock(&mutex); // 给互斥体变量加锁
… //对变量 x 的操作
phtread_mutex_unlock(&mutex); // 给互斥体变量解除锁

  线程同步

  同步就是线程等待某个事件的发生。只有当等待的事件发生线程才继续执行,否则

线程挂起并放弃处理器。当多个线程协作时,相互作用的任务必须在一定的条件下同步。

  Linux 下的 C 语言编程有多种线程同步机制,最典型的是条件变量(condition 
variable)。pthread_cond_init 用来创建一个条件变量,其函数原型为:

pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *attr);

  pthread_cond_wait 和 pthread_cond_timedwait 用来等待条件变量被设置,值得注意

的是这两个等待调用需要一个已经上锁的互斥体 mutex,这是为了防止在真正进入等待
状态之前别的线程有可能设置该条件变量而产生竞争。pthread_cond_wait 的函数原型为:

pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex);

  pthread_cond_broadcast 用于设置条件变量,即使得事件发生,这样等待该事件的

线程将不再阻塞:

pthread_cond_broadcast (pthread_cond_t *cond) ;

  pthread_cond_signal 则用于解除某一个等待线程的阻塞状态: