如果多个线程试图同时获取相同的互斥锁,是否有办法给予某个线程优先级
例如,您有2个线程同时启动并且它们睡眠然后尝试获取锁
在主线程中
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_t thrd1, thrd2;
pthread_create( &thrd1, NULL, someFunc, NULL);
pthread_create( &thrd2, NULL, someFunc, NULL);
和someFunc()
会有
usleep(1000);
pthread_mutex_lock(&mut);
我认为这与线程优先级有关,但这似乎是一个不同的主题。
有没有办法保证线程2首先锁定mut
?
答案 0 :(得分:1)
您的问题未明确,因为您没有提供有关用例的任何参数或您如何确定要做出的选择。你似乎相信只有优先权足以让你获得你想要的行为,但这是一种谬论。
仅限优先权是不够的。
仅凭优先级不允许优先级较高的线程从已获得锁定的较低优先级线程中夺取互斥锁的控制权。优先级较低的线程必须自愿产生锁定,以便安全地处理受保护的临界区。如果允许优先级较高的线程将互斥锁从较低优先级的线程中拉出,那么关键部分中的状态可能会由较低优先级的线程保持不一致,这可能会导致较高优先级线程出现问题。
以下是一些选项。
选项1:首先启动线程2.
这是最简单的解决方案。首先启动线程2,让它在获取锁定时通知主线程。然后,主线程可以启动线程1。
如果你真的只是希望每个线程都能在没有主线程干预的情况下解决它,那么你可以指定你的意思"保证线程2先得到锁定"。如果线程1真正首先唤醒,并且在没有任何争用的情况下进行锁定,那么您期望它做什么呢?并且,线程1如何知道它是线程1而不是线程2?
选项2:为什么要关心哪个线程是哪个?
如果没有特定的原因,线程2是线程2,那么你可以让哪个线程首先得到锁,做任何线程2应该做的事情,然后后续线程做任何线程1的假设要做。
这将问题简化为只需要知道是否有任何线程已经消失。但是,如果你真的关心线程2应该先行,那么你仍然需要处理线程1获得锁定的情况。所以,它需要以某种方式知道它是线程1,它需要知道线程2还没有完成它的事情。
选项3:让线程1等待线程2(不知何故)。
当线程启动时,它首先确定它是哪个线程。如果它是线程1,它等待线程2的指示它可以获得锁定。如果它是线程2,它首先获取锁,然后向线程1发出一个指示,它可以获得锁。
选项1和3有一个线程通知另一个线程。有关如何传递此通知的许多变体。您可以使用信号量,条件等待,或管道,甚至自旋锁。还有很多其他选择,它取决于您认为适合您的应用的正确选择。