您的位置:首页 > 运维架构 > Linux

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

2006-08-10 12:49 681 查看
mutex是确保两个线程(包括父线程)不会在同一时刻操作同一内存的方法。由此逻辑可以完成两个线程之间的数据发送,父线程拥有一个数据结构的缓存和与它相关的读写计数器。子线程可以从缓存中获得数据和写数据。当子线程读数据的时候,它填充缓存,并且更新计数器。父线程可以监视缓存计数器的值,并报告数据是否准备好:是或否,还是错误。并不是所有得系统都可以确认缓存可以被写以便程序可以去写数据。无论如何,当两个线程进行通讯时,采用一种锁机制以确保数据总是能够被正常读写是非常必要的。mutex就是这样的一种机制。它确保对于同样内存的操作是相互排斥的。
mutex结构和函数

pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;

intpthread_mutex_init(pthread_mutex_t*mutex,pthread_mutexattr_t*attr);

intpthread_mutex_destroy(pthread_mutex_t*mutex);

intpthread_mutex_lock(pthread_mutex_t*mutex);-锁住一个mutex.这个函数阻塞,一直到这个mutex被解锁.如果同一线程已经锁住了这个mutex不要再去对它加锁。

intpthread_mutex_trylock(pthread_mutex_t*mutex);-如果另外的进程已经锁住了这个mutex,函数将返回一个错误。但函数不会被阻塞。

intpthread_mutex_unlock(pthread_mutex_t*mutex);


不要拷贝mutex.一个mutex声明的例子:
typedefstructinput_data

{

pthread_mutex_tmutex;//控制对sharedint的读写

intsharedint;

}input_data;


input_datadatain={PTHREAD_MUTEX_INITIALIZER,0};

条件变量
条件变量用于传达带有一个mutex的共享数据的状态信息。当一个线程等待一个条件变量得时候,它将处于阻塞状态。

pthread_cond_tcond=PTHREAD_COND_INITIALIZER;

intpthread_cond_init(pthread_cond_t*cond,pthread_condattr_t*condattr);

intpthread_cond_destroy(pthread_cond_t*cond);

intpthread_cond_wait(pthread_cond_t*condition,pthread_mutex_t*mutex);

intpthread_cond_timedwait(pthread_cond_t*condition,pthread_mutex_t*mutex,structtimespec*expiration);

intpthread_cond_signal(pthread_cond_t*condition);

intpthread_cond_broadcast(pthread_cond_t*condition);

不要拷贝共享变量。一个关于共享变量声明的例子:
typedefstructinput_data

{

pthread_mutex_tmutex;//控制对sharedint的读写

pthread_cond_tcondition;//确定sharedint的变化

intsharedint;

}input_data;


input_datadatain={PTHREAD_COND_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,0};

google_ad_client="pub-2416224910262877";
google_ad_width=728;
google_ad_height=90;
google_ad_format="728x90_as";
google_ad_channel="";
google_color_border="E1771E";
google_color_bg="FFFFFF";
google_color_link="0000FF";
google_color_text="000000";
google_color_url="008000";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: