【问题标题】:In C/C++ on linux, how do I create a prelocked mutex在 Linux 上的 C/C++ 中,如何创建预锁定互斥锁
【发布时间】:2012-03-08 14:26:42
【问题描述】:

我使用什么属性来创建在创建时被创建线程锁定的 pthreads 互斥锁?

【问题讨论】:

  • 你的名字真棒。祝您在寻求答案的过程中好运。
  • 这样的机制似乎不存在。如果您可以详细说明您对此类要求的需求,SO 的人可以帮助您解决它。
  • 这种方法有什么用途?

标签: c++ c linux pthreads mutex


【解决方案1】:

pthreads 互斥接口似乎不支持它。您将不得不相互锁定它,并使用其他一些同步方法来防止其他线程在您之前抓住它(这是我假设您在这里想要做的),在下面的半伪代码中:

pthread_mutex_lock(my_pthread_creation_mutex);

pthread_mutex_init(new_mutex, mutex_attributes);
pthread_mutex_lock(new_mutex);

pthread_mutex_unlock(my_pthread_creation_mutex);

【讨论】:

    【解决方案2】:

    最接近你想要的就是使用信号量。它们可以用特定值初始化。在 linux 上(因为你有那个标签)man sem_overview 应该给你一个很好的介绍这个主题

    【讨论】:

    • 这个答案是正确的,但它仍然受到我在回答中提到的相同问题的影响,即如果 OP 需要这样的东西,代码可能是错误的,因为没有办法需要正确的代码它。 (另一方面,使用 named 信号量可以工作,因为O_EXCL|O_CREAT 可以为您进行必要的同步。)
    【解决方案3】:

    在锁定状态下创建的互斥体与由创建它的线程创建并随后锁定的互斥体之间没有明显的区别。也就是说,如果你写(假设):

    pthread_mutex_init(&mutex, &prelocked_attr);
    /* done */
    

    pthread_mutex_init(&mutex, 0);
    pthread_mutex_lock(&done);
    /* done */
    

    在这两种情况下,任何其他线程在创建线程到达“完成”注释并随后执行一些可以让其他线程知道互斥锁存在的操作之前尝试以任何方式访问互斥锁都是 UB。

    您认为您需要一个预先锁定的互斥锁这一事实强烈向我表明您正在尝试做一些非常非常错误的事情,并且可能会调用未定义的行为。

    【讨论】:

    • 抱歉,我不让我发表评论。不知道为什么。 @R 主要作为学术问题提出。我似乎记得看到过对预锁定互斥锁的引用,但它可能是对预设信号量的引用。无论哪种情况,我都使用 stl 向量来跟踪多个线程中的活动。主线程尽职尽责地检查每个线程存储的“时间”是否在增加。我以为我有一个竞争条件,主线程在更新之前检查线程节点。不是问题。向节点添加互斥锁是为了防止主节点看起来太快。谢谢。
    【解决方案4】:

    你不能。如果你需要这样做,你必须在允许其他线程访问它之前锁定它。无论如何,您都必须这样做,以防止其他线程在初始化完成之前访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-31
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多