LINUX.ORG.RU

поможите ламеру

 ,


0

1

Народ, подскажите, как остановить поток в нужный момент.

Есть класс

class A{
    public:
        int exit;

        A(){
            exit=1;
        }

        virtual void _doWork(){
            int i=0;
            while(exit){
                i++;
            }
        }

        static void *doWork(void *param){
            A *classY=(A*)param;
            classY->_doWork();
        }
};

в функции main()

pthread_t thrd;
A classA;
pthread_create(&thrd, NULL, A::doWork, (void *)&classA );

Как остановить запустившийся цикл?

просто

classA.exit=0;
не помогает
pthread_join(thrd,NULL);
тоже



Последнее исправление: beastie (всего исправлений: 7)

pthread_cancel

И да, пользуйся тегом [code]

anonymous
()

Даже интересно стало, а где ты classA.exit=0; писал? Можешь полный код привести, желательно с оформлением (см LORcode).

Quickern ★★
()
Последнее исправление: Quickern (всего исправлений: 1)

Без разметки не очень читабельно.

Добавь ключевое слово volatile к переменной, которую проверяет цикл на необходимость остановки.

mkam
()
Ответ на: комментарий от krol

нет я не хочу убивать процесс, хочу цивилизованно выйти.

pthread_cancel, которым ты решил воспользоваться, немногим лучше.

tailgunner ★★★★★
()
#include <iostream>
#include <thread>
using namespace std;

int main() {
    bool flag = true;

    thread th( [&]{ 
        while( flag ); 
        cout << "Hello!\n"; 
    } );
    
    this_thread::sleep_for( 1s );
    flag = false;
    
    th.join();
}
anonymous
()

Используй std::thread и атомарную переменную (например std::atomic_flag) в качестве признака выхода из цикла.

std::thread workerThread;
std::atomic_flag exitFlag;
exitFlag.test_and_set();

workerThread = std::thread(threadProc);

void threadProc()
{
    while(exitFlag.test_and_set()) {
        // Do something
    }
}

Когда захочешь завершить поток, просто установи этот флаг:
exitFlag.clear();
if(workerThread.joinable())
    workerThread.join();

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)
Ответ на: комментарий от m0rph

В сообщении выше логика получилась наоборот (exitFlag == runningFlag), но думаю идея понятна.

m0rph ★★★★★
()
Ответ на: комментарий от anonymous

Не, конкретно для while(exit). Он что, если exit не атомик может не завершится?

Leron ★★
()
Ответ на: комментарий от Leron

И чем атомик лучше volatile int?

В случае с x86 и применении в качестве флага выхода из цикла - особо ничем. В таких условиях и простой bool обычно прекрасно работает. А вообще, volatile, ЕМНИП, не гарантирует атомарность, и на других архитектурах при другом варианте применения возможны гонки.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 2)
Ответ на: комментарий от Leron

В таком применении собственно атомарность не нужна, нужна именно волатильность. Применяя atomic, мы просто пользуемся тем, что атомики тоже волатильные.

Beewek ★★★
()
Ответ на: комментарий от Beewek

Да, атомарность булевому флагу, который нужен для выхода из потока абсолютно не уперлась. Кто утверждает иначе или куку или троль.

Booster ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.