现在的位置: 首页 > 综合 > 正文

CTDP linux 程序员手册 C和C++编程(10)Linux mutex互斥和条件变量

2014年02月20日 ⁄ 综合 ⁄ 共 1828字 ⁄ 字号 评论关闭
mutex是确保两个线程(包括父线程)不会在同一时刻操作同一内存的方法。由此逻辑可以完成两个线程之间的数据发送,父线程拥有一个数据结构的缓存和与它相关的读写计数器。子线程可以从缓存中获得数据和写数据。当子线程读数据的时候,它填充缓存,并且更新计数器。父线程可以监视缓存计数器的值,并报告数据是否准备好:是或否,还是错误。并不是所有得系统都可以确认缓存可以被写以便程序可以去写数据。无论如何,当两个线程进行通讯时,采用一种锁机制以确保数据总是能够被正常读写是非常必要的。mutex就是这样的一种机制。它确保对于同样内存的操作是相互排斥的。
mutex结构和函数
  • pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  • int pthread_mutex_init (pthread_mutex_t *mutex, pthread_mutexattr_t *attr);
  • int pthread_mutex_destroy (pthread_mutex_t *mutex);
  • int pthread_mutex_lock (pthread_mutex_t *mutex); - 锁住一个mutex. 这个函数阻塞,一直到这个 mutex 被解锁. 如果同一线程已经锁住了这个mutex 不要再去对它加锁。
  • int pthread_mutex_trylock (pthread_mutex_t *mutex); - 如果另外的进程已经锁住了这个mutex ,函数将返回一个错误。但函数不会被阻塞。
  • int pthread_mutex_unlock (pthread_mutex_t *mutex);
不要拷贝mutex. 一个 mutex 声明的例子:
typedef struct input_data
{
   pthread_mutex_t mutex; //控制对 sharedint的读写
   int sharedint;
} input_data;
 
input_data datain = {PTHREAD_MUTEX_INITIALIZER, 0};

条件变量
条件变量用于传达带有一个mutex的共享数据的状态信息。当一个线程等待一个条件变量得时候,它将处于阻塞状态。
  • pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
  • int pthread_cond_init (pthread_cond_t *cond, pthread_condattr_t *condattr);
  • int pthread_cond_destroy (pthread_cond_t *cond);
  • int pthread_cond_wait (pthread_cond_t *condition, pthread_mutex_t *mutex);
  • int pthread_cond_timedwait (pthread_cond_t *condition, pthread_mutex_t *mutex, struct timespec *expiration);
  • int pthread_cond_signal (pthread_cond_t *condition);
  • int pthread_cond_broadcast (pthread_cond_t *condition);
不要拷贝共享变量。一个关于共享变量声明的例子:
typedef struct input_data
{
   pthread_mutex_t mutex; //控制对 sharedint的读写
   pthread_cond_t condition; //确定sharedint的变化
   int sharedint;
} input_data;
 

input_data datain = {PTHREAD_COND_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 0}; 

抱歉!评论已关闭.