- 论坛徽章:
- 0
|
原帖由 什么名 于 2008-10-30 11:39 发表 ![]()
明白你的意思了,按照如下方式是吗?
约定 flagA = 1 E线程操作数据, flagA = 0 , A,B,C,D 操作数据
A:
pthread_mutex_lock(&lockerA);
while((flagA==0)&&(数据未写完)) {
写数据; ...
改了一下,在flag=1时,A不可写,此时应该让其阻塞,结合条件变量调用pthread_cond_wait,这样会自动解锁,而等条件成立时候又会自动加锁,从而继续A线程,
不会引起由goto跳转早餐部分代码流程被忽略,也不会有多次被解锁的问题,不知道是否正确呢?
但仍然发现几个问题“
- //约定 flagA = 1 E线程操作数据, flagA = 0 , A,B,C,D 操作数据
- //A:
- pthread_mutex_lock(&lockerA);
- while((flagA==0) && (数据未写完)) { // 问题1: 影响性能,同时如果写数据是多个语句,而且耗时很长,照样不能及时解锁
- 写数据;
- }
- if (flagA==1) {
- //pthread_mutex_unlock(&lockerA);
- pthread_cond_wait(&cond, &locker); // 阻塞
- // // 问题2: 前面wihle中未写完成的数据怎么办?
- }
- ……
- pthread_mutex_unlock(&lockerA);
- //E:
- if (pthread_mutex_trylock(&lockerA) == EBUSY ) {
- flagA = 1; // tell A to unlock
- pthread_cond_signal(); //notify A to unlock
- pthread_mutex_lock(&lockerA);
- 写数据 a, b, c, d;
-
- pthread_mutex_unlock(&lockerA);
- } else { // get the locker
-
- 写数据 a, b, c, d;
- pthread_mutex_unlock(&lockerA);
- }
复制代码
[ 本帖最后由 什么名 于 2008-10-30 13:06 编辑 ] |
|