现在我被卡住了,这就是我要做的事情:
在函数中的某个点(即所有线程都会调用),会有一个Sleep(时间)函数,这使得线程休眠,函数不返回。这是我想要另一个线程 - 线程2,访问和使用该函数,修改全局变量,直到它休眠,所以线程3可以访问该函数,等等......
访问全局变量的“临界区”函数具有未指定的访问时间,它永远不会相同。
最初,主要是我打电话
InitializeCriticalSection(&m_stCriticalSection);
我尝试的是,当调用此函数时,我立即调用
EnterCriticalSection(&m_stCriticalSection);
然后我修改全局变量ect,然后在睡眠(时间)之前调用
LeaveCriticalSection(&m_stCriticalSection);
问题是,即使我离开它,其他线程也无法访问该函数。 我的其他线程有没有办法连续,甚至每5秒钟访问一个关键部分?我的实施可以更好吗?
所以这就是我现在所拥有的
void function() // all our threads will access this
{
EnterCriticalSection(&obj)
// manipulate global data
LeaveCriticalSection(&obj)
Sleep(long time) // another thread SHOULD NOW have access to this section!
return true;
}
答案 0 :(得分:0)
“//操纵全局数据”部分中是否存在进程失败的可能性?
如果是这样,那么永远不会调用LeaveCriticalSection(& obj)。
您是否尝试过将调试日志放在LeaveCriticalSection(& obj)之前?
答案 1 :(得分:0)
我认为,使用scoped-helpers会更加错误,这会帮助你再次出现'在EnterCriticalSection()之后和LeaveCriticalSection()之前发生一些异常,以便LeaveCriticalSection()真的永远不会发生'。
你可以在CS附近做一些包装(参见上文)并进行一些跟踪。
另外,我假设收集应用程序转储很容易,并通过WinDbg查看当前线程状态& cs state。