我有3个进程(同等优先级)
获取互斥锁的优先级如下:P1(1 priority), P2(2 priority), P3(timer)(3 priority)
如果假设p3
来到并获得互斥锁
然后p2
来等待互斥
之后p1来了,它也等待互斥量
如果p3
释放互斥锁,则p1
应该使互斥锁不是p2
。
如何在C或C ++中执行此操作。
注意:所有进程都在具有相同优先级的线程内运行。
OS - windows Xp
答案 0 :(得分:2)
由于线程具有相同的优先级,哪个线程获得锁定将是相当随意的。看起来你想等待一个条件变量,而不是使用一个简单的互斥锁。你仍然会有一个互斥量;条件变量是互斥体之上的概念。另一种可能性是使用同步障碍。
编辑: 使用pthreads接口(C风格)使用条件变量的示例: https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal
您需要问自己一个重要的问题:所有这些等待和同步,您是否在购买任何东西?使用线程的目的是让一些东西并行运行。如果没有发生这种情况,您的多线程应用程序运行速度比应用程序根本不使用线程要慢。
答案 1 :(得分:2)
SetThreadPriority(
HANDLE hThread,
int nPriority
);
此函数将设置线程的优先级....创建线程时将获得的HANDLE
值。如
:HANDLE hf=_beginthred(abc,0,NULL)
答案 2 :(得分:1)
根据优先级进行锁定获取是deadlocks的一个方法。 锁定应始终以可预测的顺序进行,否则您将具有经典(A,B),(B,A)死锁可能性。
您将希望使用priority queue并让锁本身为内核管理。当然,您可以使用信号量而不是互斥量来让内核知道有多少等待线程在排队的项目上唤醒。但是,您仍然希望在访问时锁定队列
答案 3 :(得分:0)
当你在互斥锁上等待时,进程的线程被添加到互斥等待队列(链表)中,你唯一的机会就是有可能改变队列中的选择行为。也许Windows提供了这种可能性,或者队列默认按优先级排序(最有可能)。
您的进程具有相同的优先级这一事实不是问题,因为线程时间片将是进程和线程优先级的函数。