2015-07-26 2 views
1

Я программист на C#, и теперь мне нужно создать программу на C++. То, что я пытаюсь достичь, это сделать бесконечный поток и дать ему время сна.Попытка понять потоки в C++

В C# я мог бы легко сделать это как

в основной функции

new Thread(taskfunction).Start(); 

и taskfunction

private void taskfunction() 
    { 
    while(true){Thread.Sleep(2500); // do stuff} 
    } 

так это будет работать в фоновом режиме, пока моя программа включена. Я пытаюсь добиться того же в C++ как:

в основной функции

std::thread somethread(taskfunction); 
somethread.join(); 

и taskfunction

void taskfunction() 
{ 
while(true){this_thread::sleep_for(chrono::milliseconds(2500));// Do Stuff} 
} 

Таким образом, в то время как C# резьбы начинается и движется на C++ поток ожидает somethread.join(); , В чем разница и как я могу достичь того, что я делаю в C#, также в C++?

Спасибо

+0

На самом деле вам нужно присоединиться или отключить свои потоки в C# и в C++ –

+2

'join' означает« подождать, пока поток завершится ». Это не то, что вы хотите. Вы можете либо «отсоединиться», оставив другой поток в покое, либо поместив объект 'std :: thread' куда-нибудь позже. Просто не уничтожайте 'std :: thread'-объект без' join'ing или 'detach'ing в первую очередь. – nwp

ответ

3

std::thread::join() блокировать текущий поток выполнения до тех пор, пока поток, на который вы его назовете, не завершит выполнение (возвращается из процедуры обработки).

Это полезно, если (например) вы хотите создать временные потоки, которые должны выполнять некоторые вычисления и генерировать результаты, которые вы ждете и используете немедленно.

В вашем случае вы не должны использовать этот метод - по крайней мере, сразу после создания потока. Однако следует отметить, что std::threadдолжны быть либо соединены или отсоедин:

std::thread::~thread()

Уничтожает объект потока.

Если *this имеет связанный с ним поток (joinable() == true), std::terminate().

Так что вам нужно либо:

  • detach() нить, если она должна быть выполнена независимо от основного потока (ресурсы, выделенные нитками будет автоматически освобождена, когда поток заканчивает выполнение)
  • проследовать в main() и когда вы дойдете до конца своей программы, пропустите сигнальную нить, чтобы она закончилась, а затем join().
+0

отсоединить опасно. Вам нужно настроить что-то, чтобы дождаться завершения потока в безопасности, и в этом случае вам будет намного лучше использовать соединение. – David

+0

Регистрация опасна. Waiing для завершения потока может легко привести к процессам, которые не будут закрыты. Вам гораздо лучше не использовать join(), используя потоки приложений/потоки приложений и никогда не эксплицитно завершать потоки. ОС намного лучше заканчивает потоки, чем любой код пользователя, и, если это возможно, должно быть разрешено делать это при завершении процесса. –

+0

@MartinJames 'join' может это сделать только в том случае, если вы напишете нить func, которая никогда не заканчивается. Вы не должны писать поток func, который никогда не заканчивается. 'join' поощряет писать хороший код, потоковые функции, которые заканчиваются безопасно (обычно сигнализируется другим потоком). 'detach' поощряет писать небезопасный код. Речь идет не о том, когда поток завершен на уровне os, так как эта проблема с производительностью является проблемой без проблем в 99% ситуаций, это касается четко определенной области кода. – David

0

использование std :: tread :: detach(). эта функция отделяет поток выполнения от объекта потока, позволяя выполнение продолжить независимо. Любые выделенные ресурсы будут освобождены после выхода потока.

Смежные вопросы