2012-03-08 69 views
2

什么属性我用它来创建一个由在创建时创建线程锁定的并行线程互斥?在C/C++在Linux上,我该如何创建一个互斥预先锁定

+0

你的名字真棒。在寻求答案时祝你好运。 – Wes 2012-03-08 14:38:04

+0

这样的机制似乎并不存在。如果你能详细说明你对这种需求的需求,那么SO的人可以帮你解决这个问题。 – Jay 2012-03-08 14:40:38

+1

这种方法的目的是什么? – 2012-03-08 14:44:53

回答

1

有是在锁定状态下创建一个互斥体之间没有可观察地,明显的差异,那就是创建并随后被锁定一个创建它的线程。也就是说,如果你写的(假设):

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

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

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

事实上,你认为你需要一个预先锁定的互斥量,建议强烈对我来说,你试图做一些非常非常错误的事情,并可能调用未定义的行为。

+0

测试 - 是否工作正常? – 2012-03-12 11:50:59

+0

对不起,我不会让我发表我的评论。不知道为什么。 @ R主要问作为一个学术问题。我似乎记得看到预先锁定的互斥体的参考,但它可能是预设信号量。无论哪种情况,我都使用stl向量来跟踪多个线程中的活动。主线程正在尽职地检查每个线程存储的“时间”是否正在递增。我认为我有一个竞争条件,主线程在更新之前正在检查线程节点。这不是问题。给节点添加一个互斥体是为了防止主机看起来太快。谢谢。 – 2012-03-12 11:56:45

1

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

2

它似乎不受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应该给你一个很好的介绍,该主题

+0

+1 - 比我的答案好得多。 – 2012-03-08 16:09:09

+0

这个答案是正确的,但它仍然受到我在我的回答中提到的同样的问题,即如果OP需要这样的事情,代码可能是错误的,因为没有办法正确的代码可能需要它。 (另一方面,使用* named * semaphores可以工作,因为'O_EXCL | O_CREAT'可以为你做必要的同步。) – 2012-03-08 16:19:58

相关问题