Именование этой функции похоже на то, что это сложный процесс. Когда именно можно узнать, что это путь вместо того, чтобы делать что-то вроде этого:Темы Windows: когда вы должны использовать InterlockedExchangeAdd()?
Подготовка CRITICAL_SECTION CS; int * p = malloc (sizeof (int)); // Выделение сайта InitializeCriticalSection (& cs); // ПОДСКАЗКА для первой записи
Thread # 1 { * р = 1; // Первый Написать }
Thread # 2 { EnterCriticalSection (& CS); * p = 2; // Вторая запись LeaveCriticalSection (& cs); }
У меня есть запись, что может быть сделано в одном потоке:
Run()
{
// some code
m_bIsTerminated = TRUE;
// some more code
}
Тогда у меня есть для чтения, что делается в другом потоке (потенциально в то же время):
Terminate()
{
// some code
if(m_bIsTerminated)
{
m_dwThreadId = 0;
m_hThread = NULL;
m_evExit.SetEvent();
return;
}
// even more code
}
Какое лучшее решение для решения этой гонки? Являются ли критические разделы способ перехода или является использование InterlockedExchangeAdd() более полезным?
Я использую события для обычных событий начала и завершения потока, но это происходит, когда вы хотите завершить работу до того, как поток завершит работу. Я хочу убедиться, что он завершает изящно и помещает поток обратно в пул, поэтому его можно использовать позже, если это необходимо. –
Эти вызовы зависят от Windows. – Omnifarious
@Omnifarious: Поскольку OP упоминает InterlockedExchangeAdd, и вопрос помечен Windows, я думаю, справедливо предположить, что вопрос также зависит от Windows. – villintehaspam