2012-03-14 3 views
2

Я хотел бы иметь возможность прерывать поток следующим образом.Прерывание повышающей нити

void mainThread(char* cmd) 
{ 
    if (!strcmp(cmd, "start")) 
     boost::thread thrd(sender); //start thread 

    if (!strcmp(cmd, "stop")) 
     thrd.interrupt();  // doesn't work, because thrd is undefined here 

} 

thrd.interrupt() не представляется возможным, потому что thrd объект не определен, когда я пытаюсь прервать его. Как я могу это исправить?

ответ

5

Используйте move assignment operator:

void mainThread(char* cmd) 
{ 
    boost::thread thrd; 

    if (!strcmp(cmd, "start")) 
     thrd = boost::thread(sender); //start thread 

    if (!strcmp(cmd, "stop")) 
     thrd.interrupt(); 

} 
1

подталкивания нить подвижна, так что вы можете сделать что-то вроде:

boost::thread myThread; 
if (isStart) { 
    myThread = boost::thread(sender); 
else if (isStop) { 
    myThread.interrupt(); 
} 

Если вы хотите, чтобы передать его вокруг (например, в качестве аргумента функции) , , вы, вероятно, захотите использовать указатель или ссылку:

void 
mainThread(std::string const& command, boost::thread& aThread) 
{ 
    if (command == "start") { 
     aThread = boost::thread(sender); 
    } else if (command == "stop") { 
     aThread.interrupt(); 
    } 
} 

(Это, вероятно, нужно больше. Например, как написано, если вы выполняете mainThread("start") два раза подряд, вы будете отрывать первую нить, и никогда не сможет снова обратиться к нему.)

Другой альтернативой было бы использовать повышение :: shared_ptr ,

+1

В 'else if' первого кода не должно быть' isStop' или что-то подобное вместо 'isStart' ?. –

+0

@ AdriC.S. Да. Я исправлю это. –

0

Это не вопрос о повышающем :: нити, речь идет о объеме:

это:

if(Condition) 
    MyType foo; 
... // foo is out of scope 
foo.method(); // won't work, no foo in scope 

так же, как это:

if(Condition) 
{ 
    MyType foo; 
} // after this brace, foo no longer exists, so... 
foo.method(); // won't work, no foo in scope 

Обратите внимание, что ответы прежде всего сделать что-то вроде:

MyType foo: 
if (Condition) 
    foo.method(); // works because now there is a foo in scope 
else 
{ 
    foo.otherMethod(); // foo in scope here, too. 
} 
Смежные вопросы