【问题标题】:C++ Mutex and Function ArgumentsC++ 互斥体和函数参数
【发布时间】:2013-07-07 04:33:51
【问题描述】:

问题动机

我正在使用互斥锁来保护作为一组线程入口点的函数中的一些变量。我认为互斥锁会保护同一范围内的变量,但它会保护函数参数吗?特别是如果参数是指针

示例代码

编辑:Mutex 在 main 中声明,否则它不起作用 - 我很傻。

我有这样的功能:

void threadfunction(int index, char* const flag)
{
    //std::mutex m;
    std::lock_guard<std::mutex> lock(m);

    // Is this thread safe?
    if(*flag) { *flag = 0; index ++; }
}

int main()
{
    std::mutex m;
    std::vector<std::thread> threadvec;
    threadvec.push_back(std::thread(threadfunction)); // Or whatever it is
    ... join ...
}

我想你可以看到问题:由于参数在互斥锁的同一范围内,我会假设索引是受保护的。但是,虽然我假设存储在 'char* const flag' 中的地址是线程安全的,但我猜 '*flag' 不是。这是正确的,有解决办法吗?

谢谢

PS:对于编辑问题并不得不处理我对 html 的可怕尝试的任何人表示抱歉。

【问题讨论】:

  • 一般规则:每个资源一个互斥锁,每个线程一个锁。
  • 我不明白你想说什么。
  • 请使用 Markdown 代码格式化工具,而不是 &lt;code&gt; 标签。见这里:stackoverflow.com/editing-help#code。这次我冒昧地编辑了你的帖子。
  • Mutex 需要在所有线程之间共享。您的代码将为每个线程创建一个新的本地互斥锁 - 这不会保护任何东西。
  • @EdwardBird: char*(或任何其他变量)只有当您在互斥锁的锁定上下文中访问它时才会受到保护 - 从您访问它的任何地方。因此,在评论中回答您的问题,如果 threadfunction 是您访问它的唯一位置,那么它是受保护的。如果您也从其他地方访问它,请确保您也在那里锁定相同的互斥锁。

标签: c++ multithreading thread-safety standard-library


【解决方案1】:

索引不是“受保护的”,但它是一个局部变量,所以没有什么需要保护的。但是,您担心 flag 的内容是正确的。您的互斥锁会阻止其他线程运行此函数的主体,但不会阻止其他代码访问标志的内存(假设它们有其地址)。

【讨论】:

  • 如果互斥体是static,它将阻止其他线程运行函数的主体。在堆栈上构建的本地互斥锁什么也不做——其他线程甚至无法访问它。
  • 谢谢,我没有看到这个缺陷。我已将互斥锁移至 main
【解决方案2】:

互斥锁不保护变量,它保护 代码。如果访问数据的所有代码段都是 受互斥体保护,数据受到保护。如果有的话 访问代码而不持有 互斥体,那么你有一个竞争条件和未定义的行为。 (也就是说,设置的时候需要使用同一个互斥锁 *flag.)

【讨论】:

    【解决方案3】:

    对于我正在处理的实际代码,我在代码中使用需要保护的变量声明了互斥锁“std::mutex mMutex”。

    然后,每当需要对这些变量中的任何一个进行读/写时,互斥锁都会被锁定,然后再解锁。

    可能不是异常安全,但它似乎正在工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多