Есть два основных способа.Один из них, возможно, самый простой, состоит в том, чтобы просто отправлять каждому потоку свою собственную копию структуры данных.Таким образом, вам не придется использовать синхронизацию для защиты данных, поскольку ни один поток не разделяет данные другого потока.
Но это не сработает во многих ситуациях.Иногда вам действительно нужно использовать общую структуру данных.В этом случае вам необходимо защитить структуру данных с помощью некоторой формы объекта синхронизации.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
Выше приведен псевдокод, и в нем много места.для улучшения.Например, критическая секция должна быть обернута в объект RAII, чтобы он автоматически уничтожался, когда вы закончите с ним.Точно так же блокировка и разблокировка также должны выполняться в объекте RAII, чтобы он всегда был разблокирован независимо от того, как вы выходите из функции потока, даже при наличии исключений.
Следует отметить, что CRITICAL_SECTION может толькоиспользоваться одним процессом.Если вам нужно использовать объект типа мьютекса в нескольких процессах (а не то, что вам здесь нужно), вам нужно вместо этого использовать с именем mutex .