Есть старый код на С#, использующий лямбда выражение в качестве параметра ThreadStart:
...
bool _stopThread = false;
...
Thread devControl = new Thread(new ThreadStart(() =>
{ while (!_stopThread)
{ /* Do some job */ }
}));
Переделываю его на С++ и по причине ленности и нехватки времени хотел бы оставить .Net управление потоками, не переходя на std. Вопрос — как подцепить с++ лямбду к ThreadStart и возможно ли это вообще?
Здравствуйте, Mike1011, Вы писали:
M>bool _stopThread = false;
M> { while (!_stopThread)
Предлагаю выкинуть этот код и переписать полностью заново, без оглядки на старый, т. к. он не потокобезопасен: _stopThread должна быть помечена volatile.
Здравствуйте, koodeer, Вы писали:
K>Предлагаю выкинуть этот код и переписать полностью заново, без оглядки на старый, т. к. он не потокобезопасен: _stopThread должна быть помечена volatile.
Согласен, пожалуй буду переписывать, и без NET. Но тут как бы теоретический интерес, можно ли все-таки в С++ прицепить ляибду так же, как это было сделано в том проекте C#?
Здравствуйте, Mike1011, Вы писали:
M>Здравствуйте, koodeer, Вы писали:
K>>Предлагаю выкинуть этот код и переписать полностью заново, без оглядки на старый, т. к. он не потокобезопасен: _stopThread должна быть помечена volatile.
M>Согласен, пожалуй буду переписывать, и без NET. Но тут как бы теоретический интерес, можно ли все-таки в С++ прицепить ляибду так же, как это было сделано в том проекте C#?
Так делать можно с уверенностью только на Visual C++ под x86. В стандартном volatile в C++ ничего не гарантируется по поводу потокобезопасности, включая видимость в других потоках. То есть, в теории, на многопроцессорных системах без когерентности кеша (например, потенциально любой ARM, так как спецификация ARM не требует когерентности) другой поток может очень долго не видеть изменения состояния флага или даже вообще никогда его не увидеть.
P>Можно. std::thread именно так и работает (ну, один из вариантов):
P>
Здравствуйте, Аноним, Вы писали:
А>Так делать можно с уверенностью только на Visual C++ под x86. В стандартном volatile в C++ ничего не гарантируется
И где Вы в реальной жизни видели этот самый "стандартный C++" Все нормальные реализации C++ так или иначе поддерживают модель многопоточных вычислений.