在linux上的C/C++中,我如何创建一个预锁定的互斥对象

In C/C++ on linux, how do I create a prelocked mutex

本文关键字:一个 linux 锁定 对象 创建 C++ 何创建 上的      更新时间:2023-10-16

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

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);

使用信号量是最接近您想要的。它们可以使用特定值进行初始化。在linux上(正如您有这个标签一样)man sem_overview应该会很好地介绍这个主题

在锁定状态下创建的互斥体和创建它的线程创建并随后锁定的互斥体之间没有明显的区别

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

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

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

事实上,您认为您需要一个预先锁定的互斥体,这向我强烈地暗示了您试图做一些非常非常错误的事情,并且可能调用了未定义的行为。

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

相关文章: