【问题标题】:Handling a mutex variable in a while loop check在 while 循环检查中处理互斥变量
【发布时间】:2011-05-08 11:07:39
【问题描述】:

如果在一个线程中修改并使用互斥锁正确锁定和解锁的变量在另一个线程的 while 循环中读取,如何锁定和解锁互斥锁以便 while 循环可以读取该值,是有必要吗?

我在一个线程中设置了一个变量,并使用 while 循环在另一个线程中检查它。变量如何锁定和解锁以检查 while 循环条件?

是否是唯一合理的方法,有一个额外的变量用于运行 while 循环并将其设置为需要锁定/解锁的变量的值?

【问题讨论】:

  • 互斥体的要点是您不需要需要一个while循环。无法“锁定变量”,只能阻止代码。拿一本书,穿线的怪物会把你活活吃掉。

标签: c pthreads mutex


【解决方案1】:

编辑:@ninjalj 建议用条件变量替换while-loop 是一个很好的建议如果您正在使用while-loop 等待,直到达到程序状态。但是,如果您使用 while-loop 来工作直到达到程序状态,那么...

您应该将“lock-mutex; examine variable; unlock mutex”代码包装在一个实用函数中,然后您的while-loop 条件可以调用该函数。例如,效用函数可以写成如下代码:

int valueOfSharedVariable()
{
    int status;
    int result;

    status = pthread_mutex_lock(&mutex);
    assert(status == 0);
    result = sharedVariable;
    status = pthread_mutex_unlock(&mutex);
    assert(status == 0);
    return result;
}

那么,你的while-loop 条件可以写成如下:

while (valueOfSharedVariable() < 10) {
    ...
}

【讨论】:

  • 大多数 pthread 函数如果成功则返回 0,如果失败则返回某种错误代码。如果出现问题并且您未能正确获取或释放互斥锁,则断言存在。
  • 这个assert() 几乎救了我一命,因为它让我意识到我没有正确初始化我的互斥锁!
【解决方案2】:

您可能应该使用条件变量。见pthread_cond_wait(3)pthread_cond_signal(3)

【讨论】:

    【解决方案3】:

    您必须在读取过程中锁定它,如果其他人在同一时间写入的可能性很小。否则可能会发生各种事情,例如您看到部分更新或根本没有更新。

    如果您使用该值作为循环条件,并且在循环期间不受更新的影响,则复制并释放锁可能是个好主意。如果您会受到更改的影响,您当然必须保持锁定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 2018-04-28
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      相关资源
      最近更新 更多