我使用Windows API的CreateThread()
函数创建了两个线程。我的第一个线程(让我们称之为IMPORTANT_FAST_ACCESS)将一些数据推送到堆栈。第二个线程(让我们称之为STACK_ACCESS_SLOW)希望从该堆栈中弹出一些数据并使用它。
问题是我希望IMPORTANT_FAST_ACCESS线程能够立即访问堆栈 ,而无需等待第二个线程对其执行操作。所以我基本上希望允许IMPORTANT_FAST_ACCESS随时访问堆栈,而STACK_ACCESS_SLOW线程在其他线程没有使用它时会查找并抓住它想要的堆栈数据。
然而,如果STACK_ACCESS_SLOW开始访问堆栈,因为它是免费的1秒自我,但现在IMPORTANT_FAST_ACCESS决定它想要推送一些数据而不能等待?
我该如何解决这个问题?
答案 0 :(得分:1)
无论线程有多快或多慢,您都必须同步对共享堆栈的访问。在另一个线程正在使用它时,您不能允许一个线程修改堆栈,反之亦然。
如果您不希望较慢的线程延迟更快的线程,则必须确保较慢的线程在处理时不会在堆栈上保持锁定。这意味着拥有较慢的线程:
一次弹出一个堆栈项,每次锁定和解锁堆栈。
锁定堆栈,复制/交换堆栈,解锁并根据需要处理副本。