Как принудительно завершить поток?

187
28 апреля 2018, 18:25

С помощью async запускаю в main поток, в котором крутится бесконечный цикл. Как завершить этот поток?

Answer 1

*.pro файл для QtCreator:

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
LIBS += -lpthread
SOURCES += main.cpp

main.cpp:

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <cstdlib>
#include <future>
using namespace std;
bool ExitFlag = false;
int  someVariable = 0;
std::mutex threadMutex;

void threadFunc(){
    while (true){
        std::this_thread::sleep_for(std::chrono::seconds(1));
        someVariable = std::rand() % 100;
        std::cout << "var:" << someVariable << std::endl;
        bool needExit = false;
        threadMutex.lock();
        needExit = ExitFlag;
        threadMutex.unlock();
        if (needExit){
            break;
        }
    }
}
int main()
{
    auto f = std::async(std::launch::async, threadFunc);
    std::this_thread::sleep_for(std::chrono::seconds(10));
    threadMutex.lock();
    ExitFlag = true;
    threadMutex.unlock();
    f.get();
    cout << "Hello World!" << endl;
    return 0;
}

Вывод:

var:83
var:86
var:77
var:15
var:93
var:35
var:86
var:92
var:49
var:21
Hello World!
Answer 2

Завершить отпущенный поток извне нельзя, если в вашем потоке нет условия выхода, то это ошибка.
Для винды есть функция TerminateThread https://msdn.microsoft.com/en-us/library/windows/desktop/ms686717(v=vs.85).aspx, но её использование опасно и чревато

READ ALSO
Удаление бинарного дерева

Удаление бинарного дерева

Имеются функции:

143
Помогите разобраться с исключениями C++

Помогите разобраться с исключениями C++

Проблема в том чтобы после выполнения исключения Owerwriting программа продолжила работу и копировала файл,у меня она просто выдает исключение...

194
Не получается создать проект C++ в Visual Studio 2017

Не получается создать проект C++ в Visual Studio 2017

Когда я пытаюсь создать/открыть проект Visual C++, я получаю такое сообщение:

213
удаление элемента односвязного списка

удаление элемента односвязного списка

Помогите понять в чем ошибкаУдаляет все правильно, но при выводе списка в консоли вылетает ошибка

197