0

现在我被卡住了,这就是我想要做的:

  • 创建3个线程:
  • 这 3 个线程将访问一个共享的全局资源(一个向量)

在函数中的某个点(所有线程都会调用),会有一个 Sleep(time) 函数,它使线程休眠,该函数不返回。这是我想要另一个线程 - 线程 2 访问和使用函数的地方,修改全局变量,直到它休眠,所以线程 3 可以访问函数,等等......

访问全局变量的“临界区”函数具有未指定的访问时间,它永远不会相同。

最初,我主要打电话给

    InitializeCriticalSection(&m_stCriticalSection);

我尝试的是,当调用此函数时,我立即调用

EnterCriticalSection(&m_stCriticalSection);

然后我修改全局变量等,然后在我调用的 Sleep(time) 之前

        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;
}
4

2 回答 2

0

“//操纵全局数据”部分中的进程是否有可能失败?

如果是这样,则永远不会调用 LeaveCriticalSection(&obj)。

您是否尝试过在 LeaveCriticalSection(&obj) 之前放置调试日志?

于 2013-06-09T01:24:43.603 回答
0

我认为,使用 scoped-helpers 更容易出错,它可以帮助您解决“在 EnterCriticalSection() 之后和 LeaveCriticalSection() 之前发生一些异常,因此 LeaveCriticalSection() 真的永远不会发生”这样的情况。

您可以在 CS 周围做一些包装(见上文),并带有一些痕迹。

此外,我认为收集应用程序转储并通过 WinDbg 当前线程状态和 cs 状态查看会很容易。

于 2016-06-03T12:35:08.653 回答