锁定某个线程

Giving lock to certain thread

本文关键字:线程 锁定      更新时间:2023-10-16

如果多个线程试图同时获取相同的互斥对象,是否有方法赋予特定的线程优先级

例如,您有两个线程同时启动,它们休眠,然后尝试获取锁定

在主线程中

pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_t thrd1, thrd2;
pthread_create( &thrd1, NULL, someFunc, NULL);
pthread_create( &thrd2, NULL, someFunc, NULL);

并且CCD_ 1将具有

usleep(1000);
pthread_mutex_lock(&mut);

我认为这与线程优先级有关,但这似乎是另一个主题。有没有办法保证线程2首先锁定mut

您的问题没有得到充分说明,因为您没有提供任何关于用例或如何确定要进行选择的参数。你似乎相信只有优先权就足以让你得到你想要的行为,但这是一种谬论。

单凭优先级是不够的

仅凭优先级并不能让优先级较高的线程从已获取锁的优先级较低的线程手中夺取互斥锁的控制权。为了安全地处理受保护的关键部分,优先级较低的线程必须自愿放弃锁。如果允许优先级较高的线程将互斥锁从优先级较低的线程上拉开,那么优先级较低线程可能会使关键部分中的状态不一致,这可能会给优先级较高的线程带来问题。

这里有一些选择。

选项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有一个线程通知另一个线程。关于如何传递此通知,有许多变化。您可以使用信号量、条件等待、管道,甚至旋转锁。还有很多其他选择,这取决于你认为什么是适合你的应用程序的正确选择。