【问题标题】:Is a mutex capable of performing this互斥体是否能够执行此操作
【发布时间】:2021-06-26 23:54:59
【问题描述】:

我有一个情况,我有多个线程访问剪贴板并执行一些睡眠的操作。基本上我不想将错误的内容复制到剪贴板并以不正确的方式执行某些操作。

目前,我有一个想法是使用互斥锁来锁定std::string 变量并将所需的数据存储在其中,然后存储到剪贴板。完成动作后,我将其解锁。然后另一个线程访问变量,然后是剪贴板和操作。

由于我从未使用过互斥体,所以我的问题是 - 仅执行上述操作就可以吗?

我正在使用以下库来管理剪贴板:https://github.com/dacap/clip

【问题讨论】:

  • 互斥锁可用于保护字符串不被多个线程同时访问。听起来您可能需要condition variable 来同步线程对字符串的访问顺序。
  • 为什么要使用剪贴板在线程之间传递信息?这不是它的本意。如果您可以显示您当前的代码,那将非常有用,也许有人可以提供更好的解决方案。
  • 我正在使用剪贴板,因为我的程序与使用剪贴板粘贴代码的程序交互。

标签: c++ multithreading thread-safety mutex clipboard


【解决方案1】:

快速浏览一下库,您可能根本不需要使用mutex。例如。 set_text 函数:

bool set_text(const std::string& value) {
  lock l;
  if (l.locked()) {
    l.clear();
    return l.set_data(text_format(), value.c_str(), value.size());
  }
  else
    return false;
}

您可以看到正在创建一个锁(它根据lock l 构造时的操作系统实现来锁定资源),这应该为您提供一些线程安全性。

【讨论】:

  • 该代码无法访问std::string,即value 引用线程安全。
  • @Slava True,但从问题来看,OP 似乎正在使用他打算从线程中写入的字符串,因此他可以写入剪贴板。我在想也许这个字符串是不必要的,根据目标,你可以直接写到剪贴板。
【解决方案2】:

目前,我有一个想法是使用互斥锁来锁定std::string 变量并将所需的数据存储在其中,然后存储到剪贴板。

从你解释的方式来看,很明显你不明白它是如何工作的。 Mutex 不会锁定任何类型的变量。互斥锁本身被锁定。并且互斥锁具有一个属性,即一次只有一个线程可以锁定它。使用该属性,您可以以这样的方式组织您的程序,这样只有一个线程将访问一些关键数据,这将使此类访问线程安全。并不是说您将互斥锁链接到不相关的变量,然后该互斥锁会以某种方式锁定该变量并使其成为线程安全的。现在,如果您了解有什么不同,那么您就会明白,是的,您可以安全地访问您的std::string 变量线程,但这将要求所有访问它的线程在互斥锁下执行此操作,而不是只有一个线程锁定它而所有其他线程会神奇地服从那个锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多