2010-12-14 38 views
1

在Windows/C++,如果我有一个结构:安全地共享一个结构在多个线程

struct ListItem { 
    ListItem* next; 
    ListItem* prev; 
    ... 
} 
在两个主要过程和一些动态加载的DLL运行多个线程

在一起,和所有那些线程需要共享上述结构,我该如何阻止他们彼此跺脚?喜欢的东西:

ListItem* list = ... 

A 

list->next = ... 

B 

我怎么把A和B处,以防止不超过一个多线程运行在一个list->next = ...时间?

+1

要做的第一件事是封装整个列表以及所有直接在类中访问它的列表,并强制任何想访问它的类来使用该类。这将防止重复代码,确保使用列表的任何内容都遵守您提出的任何同步方法。 – Blrfl 2010-12-14 18:14:06

回答

5

主要有两种方式。一种可能是最简单的方法就是简单地将每个线程发送给自己的数据结构副本。这样你就不必使用同步来保护数据,因为没有线程共享另一个线程的数据。

但是这在很多情况下都不起作用。有时你确实需要共享一个共同的数据结构。在这种情况下,您需要使用某种形式的同步对象来保护数据结构。 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

+0

谢谢!对不起,我不知道它的正确词汇,但在查看您的CRITICAL_SECTION链接后,我看到那是我需要的。 :) – storm 2010-12-14 18:31:22

+0

@风暴:享受和祝你好运 – 2010-12-14 18:33:57

0

使用Windows Mutex对象,您有多个进程可以访问一个资源。

如果你的线程都在一个进程上,那么你可以使用EnterCriticalSection/LeaveCriticalSection。

+0

这个'struct'怎么可能被共享进程间呢? 'CriticalSection'是需要的,或者更好的封装它的lock_guard类。 – 2010-12-14 18:13:18

+0

我还没有真正做到这一点,但在Windows中可以创建进程间共享内存。将此内存中的指针转换为Stack *。使用指定的互斥锁保护访问。你有它。 – ThomasMcLeod 2010-12-14 21:17:14

+0

Windows共享文件和内存:http://msdn.microsoft.com/en-us/library/aa366878(VS.85).aspx – ThomasMcLeod 2010-12-14 21:18:15

0

这功课吗?无论如何,请尝试使用Google搜索“关键部分”。

+0

我怀疑这是作业。 – 2010-12-14 18:14:34

0
+0

不,在这里'Mutex'不正确。 – 2010-12-14 18:13:36

+2

@Steve:它*可能*是正确的。它只是不是最佳的。 – 2010-12-14 18:16:53

+0

@约翰,一般的公平点。虽然这个应用程序? – 2010-12-14 18:23:28

0

根据你需要的结构,你可以使用一些无锁的数据结构,如Win API interlocked SList。这种方式即使在多线程正在执行操作时,数据结构仍然是一致的。