ThreadStart в С++
От: Mike1011  
Дата: 06.02.14 19:24
Оценка: :)
День добрый!

Есть старый код на С#, использующий лямбда выражение в качестве параметра ThreadStart:
...
bool _stopThread = false;
...
Thread devControl = new Thread(new ThreadStart(() =>
{ while (!_stopThread)
{ /* Do some job */ }
}));

Переделываю его на С++ и по причине ленности и нехватки времени хотел бы оставить .Net управление потоками, не переходя на std. Вопрос — как подцепить с++ лямбду к ThreadStart и возможно ли это вообще?

Заранее спасибо,
Михаил
thread threadstart потоки c++ c#
Re: ThreadStart в С++
От: koodeer  
Дата: 06.02.14 20:13
Оценка: +3
Здравствуйте, Mike1011, Вы писали:

M>bool _stopThread = false;



M> { while (!_stopThread)


Предлагаю выкинуть этот код и переписать полностью заново, без оглядки на старый, т. к. он не потокобезопасен: _stopThread должна быть помечена volatile.
Re[2]: ThreadStart в С++
От: Mike1011  
Дата: 07.02.14 15:21
Оценка:
Здравствуйте, koodeer, Вы писали:

K>Предлагаю выкинуть этот код и переписать полностью заново, без оглядки на старый, т. к. он не потокобезопасен: _stopThread должна быть помечена volatile.


Согласен, пожалуй буду переписывать, и без NET. Но тут как бы теоретический интерес, можно ли все-таки в С++ прицепить ляибду так же, как это было сделано в том проекте C#?
Re[3]: ThreadStart в С++
От: fdn721  
Дата: 13.02.14 07:21
Оценка:
Здравствуйте, Mike1011, Вы писали:

M>Здравствуйте, koodeer, Вы писали:


K>>Предлагаю выкинуть этот код и переписать полностью заново, без оглядки на старый, т. к. он не потокобезопасен: _stopThread должна быть помечена volatile.


M>Согласен, пожалуй буду переписывать, и без NET. Но тут как бы теоретический интерес, можно ли все-таки в С++ прицепить ляибду так же, как это было сделано в том проекте C#?


Можно. boost::thread тебе в помощь.
Re[3]: ThreadStart в С++
От: pentagra  
Дата: 13.02.14 08:23
Оценка:
Здравствуйте, Mike1011, Вы писали:

M> ... можно ли все-таки в С++ прицепить ляибду так же, как это было сделано в том проекте C#?


Можно. std::thread именно так и работает (ну, один из вариантов):

    volatile bool stopStatThread(false);

    std::thread statThread([&]()
    {
      while (!stopStatThread)
      {
        ...
      }
    }
    );
Re[4]: ThreadStart в С++
От: Аноним  
Дата: 13.02.14 18:03
Оценка:
Здравствуйте, pentagra, Вы писали:

Так делать можно с уверенностью только на Visual C++ под x86. В стандартном volatile в C++ ничего не гарантируется по поводу потокобезопасности, включая видимость в других потоках. То есть, в теории, на многопроцессорных системах без когерентности кеша (например, потенциально любой ARM, так как спецификация ARM не требует когерентности) другой поток может очень долго не видеть изменения состояния флага или даже вообще никогда его не увидеть.

P>Можно. std::thread именно так и работает (ну, один из вариантов):


P>
P>    volatile bool stopStatThread(false);

P>    std::thread statThread([&]()
P>    {
P>      while (!stopStatThread)
P>      {
P>        ...
P>      }
P>    }
P>    );
P>
Re[5]: ThreadStart в С++
От: drol  
Дата: 14.02.14 05:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Так делать можно с уверенностью только на Visual C++ под x86. В стандартном volatile в C++ ничего не гарантируется


И где Вы в реальной жизни видели этот самый "стандартный C++" Все нормальные реализации C++ так или иначе поддерживают модель многопоточных вычислений.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.