主要有两种方式。一种可能是最简单的方法就是简单地将每个线程发送给自己的数据结构副本。这样你就不必使用同步来保护数据,因为没有线程共享另一个线程的数据。
但是这在很多情况下都不起作用。有时你确实需要共享一个共同的数据结构。在这种情况下,您需要使用某种形式的同步对象来保护数据结构。 Boost.Threads提供了一些跨平台的,我相信有人会告诉你如何使用它们。既然你问了关于Windows的具体问题,我会告诉你一个Windows方法。可以使用CRITICAL_SECTION。首先,您需要初始化的关键部分在你的主线程,你脱掉你的工作线程之前:
int main()
{
// ...
CRITICAL_SECTION cs;
InitializeCriticalSection(&cs);
// ...
}
然后将指针传递给CS到每个工作线程。 (这留作锻炼。)在每个工作线程中,在处理数据之前输入cs,并在完成时将其保留。
CRITICAL_SECTION* pcs = ...; // passed in from main thread
EnterCriticalSection(pcs); // this will block until the cs is "available"
list->next = ...
LeaveCriticalSection(pcs); // makes the cs available to other threads
以上是psudocode,有很大的改进空间。例如,关键部分应该包装在RAII对象中,以便在完成后自动销毁。同样,锁定和解锁也应该在RAII对象中完成,无论您如何退出线程函数,即使面临异常,也始终解锁锁定和解锁。
您应该注意,CRITICAL_SECTION只能由单个进程使用。如果您需要跨多个进程使用互斥对象类型的对象(而不是您在此需要的),那么您需要使用named mutex。
要做的第一件事是封装整个列表以及所有直接在类中访问它的列表,并强制任何想访问它的类来使用该类。这将防止重复代码,确保使用列表的任何内容都遵守您提出的任何同步方法。 – Blrfl 2010-12-14 18:14:06