В настоящее время я пытаюсь добиться синхронизации потоков в С++ .net, используя только атомарные операции, используя класс System::Threading::Interlocked в .net. Я не очень разбираюсь в многопоточности и пытаюсь использовать синхронизацию потоков без блокировки. В настоящее время я создал класс с именем settings, который содержит статические переменные, которые мне нужно разделить между потоками. Затем я создал в нем две статические функции: одну для установки статических данных-членов и одну для их чтения. В настоящее время так выглядит одна из моих статических функций синхронизации. Я понимаю, что если в эту функцию одновременно войдут более двух потоков, они могут навсегда застрять в цикле while, но эта функция будет нужна только двум потокам: потоку с графическим интерфейсом и основному потоку, который будет читать настройки и отправлять работу рабочим потокам.
//object is handle to instance of settings class that also contains non-static
//members that will contain each threads copy of the data.
void Settings::SetStaticVariables(Settings ^object)
{
int returnvalue;
//canchange variable is a static integer of the class "Settings"
returnvalue = Threading::Interlocked::Increment(Settings::canchange);
if(returnvalue > 1)
{
while(Settings::canchange > 1)
{
//perhaps eventually I will find an alternative to telling the thread
//to sleep for a defined amount of time, maybe when I learn how to use events
//for now this will do, speed is not very important for this data sync as
//it does not occure often
Threading::Thread::Sleep(50);
}
}
//data synchronization of static members here
//decrement allowing waiting threads to exit while loop
Threading::Interlocked::Decrement(Settings::canchange);
};
Мой вопрос в том, видите ли вы что-то ошибочное, что не даст мне того, что я ожидаю, или вся эта идея синхронизации ошибочна?