如何控制EnterCriticalSection的优先级

时间:2022-10-08 05:27:53
void Thread1
{
    EnterCriticalSection(&cs);
    //全局资源操作
    LeaveCriticalSection(&cs);
}

void Thread2
{
   while(true)
  {
     EnterCriticalSection(&cs);
    //全局资源操作
     LeaveCriticalSection(&cs);
  }
}
这2个线程启动后,Thread1至多只能运行一次,全被Thread2抢去了,如何控制优先级,让Thread2里的LeaveCriticalSection(&cs);后让Thread1里的EnterCriticalSection(&cs)响应,而不是Thread2里的。

20 个解决方案

#1


让Thread2用Sleep可以,但这样似乎不是好的编程风格吧

#2


自己再顶一下,加个标记值也行,但会造成Thread2一段时间的无限循环,感觉也不是好的编程风格。

#3


WaitForSingleObject

#4


引用 3 楼  的回复:
WaitForSingleObject


详细点给出例子行么,谢谢

#5


线程调度是OS的事,但是如果你想这样的话,可以进行线程同步
具体可以参考:CreateMutex、WaitForSingleObject

#7


线程的调度由操作系统内核来管理的

#8


BOOL SetThreadPriority(
  HANDLE hThread, // handle to the thread
  int nPriority   // thread priority level
);
//优先级好像不能超过15

#9


我擦。。。你这线程函数进入关键段再退出函数就结束了啊,当然只有一次了

#10


引用 9 楼  的回复:
我擦。。。你这线程函数进入关键段再退出函数就结束了啊,当然只有一次了


正解

8楼以上包括8楼的目的都很单纯,就是为了得分,根本不看问题。

#11


引用 9 楼  的回复:
我擦。。。你这线程函数进入关键段再退出函数就结束了啊,当然只有一次了


表达的是有问题,9楼说的很正确

void Thread1
{
  while(true)
 {
  accept();//这里有个阻塞函数如accept,recv之类的
  EnterCriticalSection(&cs);
  //全局资源操作
  LeaveCriticalSection(&cs);
 }
}

Thread1在阻塞函数执行完成之后,下面也不会执行到,全被Thread2抢去了

#12


应该是你的accept阻塞了。

#13


请注意我11楼的话,Thread1在阻塞函数执行完成之后,阻塞函数下面也执行不到,都在执行Thread2

#14


请注意我11楼的话,Thread1在阻塞函数执行完成之后,阻塞函数下面也执行不到,都在执行Thread2

#15


引用 14 楼  的回复:
请注意我11楼的话,Thread1在阻塞函数执行完成之后,阻塞函数下面也执行不到,都在执行Thread2

你怎知道你的Accept执行完毕了??你确定你的Accept返回了??

#16


用InitializeCriticalSectionAndSpinCount代替InitializeCriticalSection,用法MSDN

#17


引用 15 楼  的回复:
引用 14 楼 的回复:
请注意我11楼的话,Thread1在阻塞函数执行完成之后,阻塞函数下面也执行不到,都在执行Thread2

你怎知道你的Accept执行完毕了??你确定你的Accept返回了??

我跟踪执行过

#18


引用 16 楼  的回复:
用InitializeCriticalSectionAndSpinCount代替InitializeCriticalSection,用法MSDN

http://topic.csdn.net/u/20110704/17/a5aa88fd-cb2b-42ed-9560-676c17e5ede5.html
似乎跟我的问题没什么联系,而且单核cpu是无效的

#19


引用 17 楼  的回复:
引用 15 楼 的回复:
引用 14 楼 的回复:
请注意我11楼的话,Thread1在阻塞函数执行完成之后,阻塞函数下面也执行不到,都在执行Thread2

你怎知道你的Accept执行完毕了??你确定你的Accept返回了??

我跟踪执行过


能把两个线程的 进入临界区的
EnterCriticalSection(&cs);
附近的代码提出来没,照目前的情况来看,你的程序应该不会出现独占现象。需要详细的代码。

#20


我执行过几十次,Thread1临界区内的操作,会执行1-2次吧,按我的程序设计要求,Thread1里的操作需要执行5次,所以想怎么控制进入临界区的顺序

#1


让Thread2用Sleep可以,但这样似乎不是好的编程风格吧

#2


自己再顶一下,加个标记值也行,但会造成Thread2一段时间的无限循环,感觉也不是好的编程风格。

#3


WaitForSingleObject

#4


引用 3 楼  的回复:
WaitForSingleObject


详细点给出例子行么,谢谢

#5


线程调度是OS的事,但是如果你想这样的话,可以进行线程同步
具体可以参考:CreateMutex、WaitForSingleObject

#6


#7


线程的调度由操作系统内核来管理的

#8


BOOL SetThreadPriority(
  HANDLE hThread, // handle to the thread
  int nPriority   // thread priority level
);
//优先级好像不能超过15

#9


我擦。。。你这线程函数进入关键段再退出函数就结束了啊,当然只有一次了

#10


引用 9 楼  的回复:
我擦。。。你这线程函数进入关键段再退出函数就结束了啊,当然只有一次了


正解

8楼以上包括8楼的目的都很单纯,就是为了得分,根本不看问题。

#11


引用 9 楼  的回复:
我擦。。。你这线程函数进入关键段再退出函数就结束了啊,当然只有一次了


表达的是有问题,9楼说的很正确

void Thread1
{
  while(true)
 {
  accept();//这里有个阻塞函数如accept,recv之类的
  EnterCriticalSection(&cs);
  //全局资源操作
  LeaveCriticalSection(&cs);
 }
}

Thread1在阻塞函数执行完成之后,下面也不会执行到,全被Thread2抢去了

#12


应该是你的accept阻塞了。

#13


请注意我11楼的话,Thread1在阻塞函数执行完成之后,阻塞函数下面也执行不到,都在执行Thread2

#14


请注意我11楼的话,Thread1在阻塞函数执行完成之后,阻塞函数下面也执行不到,都在执行Thread2

#15


引用 14 楼  的回复:
请注意我11楼的话,Thread1在阻塞函数执行完成之后,阻塞函数下面也执行不到,都在执行Thread2

你怎知道你的Accept执行完毕了??你确定你的Accept返回了??

#16


用InitializeCriticalSectionAndSpinCount代替InitializeCriticalSection,用法MSDN

#17


引用 15 楼  的回复:
引用 14 楼 的回复:
请注意我11楼的话,Thread1在阻塞函数执行完成之后,阻塞函数下面也执行不到,都在执行Thread2

你怎知道你的Accept执行完毕了??你确定你的Accept返回了??

我跟踪执行过

#18


引用 16 楼  的回复:
用InitializeCriticalSectionAndSpinCount代替InitializeCriticalSection,用法MSDN

http://topic.csdn.net/u/20110704/17/a5aa88fd-cb2b-42ed-9560-676c17e5ede5.html
似乎跟我的问题没什么联系,而且单核cpu是无效的

#19


引用 17 楼  的回复:
引用 15 楼 的回复:
引用 14 楼 的回复:
请注意我11楼的话,Thread1在阻塞函数执行完成之后,阻塞函数下面也执行不到,都在执行Thread2

你怎知道你的Accept执行完毕了??你确定你的Accept返回了??

我跟踪执行过


能把两个线程的 进入临界区的
EnterCriticalSection(&cs);
附近的代码提出来没,照目前的情况来看,你的程序应该不会出现独占现象。需要详细的代码。

#20


我执行过几十次,Thread1临界区内的操作,会执行1-2次吧,按我的程序设计要求,Thread1里的操作需要执行5次,所以想怎么控制进入临界区的顺序

#21