Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在线程运行时终止_C++_Multithreading - Fatal编程技术网

C++ 在线程运行时终止

C++ 在线程运行时终止,c++,multithreading,C++,Multithreading,我无法合上我的线。我忘记做什么了吗?线程似乎正在保存我用于关闭的值,然后从不检查它是否已更改。下面是一些具有相同效果的示例代码: #include "stdafx.h" #include "Windows.h" #include <iostream> #include <thread> class test { private: bool user_wants_thread = true; bool time_to_close = false; pub

我无法合上我的线。我忘记做什么了吗?线程似乎正在保存我用于关闭的值,然后从不检查它是否已更改。下面是一些具有相同效果的示例代码:

#include "stdafx.h"
#include "Windows.h"
#include <iostream>
#include <thread>

class test {
private:
    bool user_wants_thread = true;
    bool time_to_close = false;

public:
    bool set_timetoclose(bool in) {
        time_to_close = in;
        if (time_to_close == in) {
            return true;
        }
        return false;
    }
    void function() {
        while (user_wants_thread) {
            // CODE
            std::cout << time_to_close;
            Sleep(100);
            if (time_to_close) {
                goto close;
            }
        }
    close:
        Sleep(1);
    }
};

int main() {
    test t;

    std::thread thread_func(&test::function, t);
    Sleep(1000);

    bool success;
    do {
        success = t.set_timetoclose(true);
    } while (!success);

    thread_func.join();
    std::cout << "Closed";
    std::cin.get();
}
#包括“stdafx.h”
#包括“Windows.h”
#包括
#包括
课堂测试{
私人:
bool用户需要线程=true;
bool time_to_close=假;
公众:
bool set_timetoclose(bool in){
关闭时间=英寸;
如果(时间到关闭时间=in){
返回true;
}
返回false;
}
空函数(){
while(用户需要线程){
//代码

std::cout我删除了一些未使用的部件,并将实际情况更改为原子状态,它似乎可以按照此链接所示工作:

然而,我并不是说这是绝对正确的,但它显示了使用原子如何导致对值的读/写之间的同步,从而导致数据竞争

#include "Windows.h"
#include <iostream>
#include <thread>
#include <atomic>
class test {

public:
    std::atomic<bool> time_to_close = false;

    test()=default;
    void function() {
        while (!time_to_close) {
            std::cout << "Running..." << std::endl;
            Sleep(100);
        }
        std::cout << "closing" << std::endl;
    }
};

int main() {
    test t;
    std::thread thread_func([&t](){t.function();});
    Sleep(500);

    t.time_to_close = true;
    std::cout << "Joining on thread" << std::endl;
    thread_func.join();
    std::cout << "Closed";

    return 0;
}
#包括“Windows.h”
#包括
#包括
#包括
课堂测试{
公众:
std::原子时到关闭=假;
test()=默认值;
空函数(){
同时(!关闭时间){

std::cout我删除了一些未使用的部件,并将实际情况更改为原子状态,它似乎可以按照此链接所示工作:

然而,我并不是说这是绝对正确的,但它显示了使用原子如何导致对值的读/写之间的同步,从而导致数据竞争

#include "Windows.h"
#include <iostream>
#include <thread>
#include <atomic>
class test {

public:
    std::atomic<bool> time_to_close = false;

    test()=default;
    void function() {
        while (!time_to_close) {
            std::cout << "Running..." << std::endl;
            Sleep(100);
        }
        std::cout << "closing" << std::endl;
    }
};

int main() {
    test t;
    std::thread thread_func([&t](){t.function();});
    Sleep(500);

    t.time_to_close = true;
    std::cout << "Joining on thread" << std::endl;
    thread_func.join();
    std::cout << "Closed";

    return 0;
}
#包括“Windows.h”
#包括
#包括
#包括
课堂测试{
公众:
std::原子时到关闭=假;
test()=默认值;
空函数(){
同时(!关闭时间){


std::cout不能确定它在完整代码实现中是否有意义,但在本例中,
break;
代替
goto close;
会引起较少的关注。通过将标记转换为
std::atomic
,您可以在
set\u timetoclose中避免一些混乱。这整件事只是一大堆未完成的工作因为完全没有排序,所以要从头开始重写,但是只有在重读C++书中的所有章节,详细讨论互斥、条件变量和排序之后,才能纠正错误。如果我错了,SamVarshavchik可以纠正我,但是,例如,我相信编译器是完全合法的。code>while(user\u wants\u thread){
位退出循环,只加载
user\u wants\u thread
一次,因为不允许任何其他更改,因为它不以任何方式同步。
break
只中断最近的循环。外部循环不受影响。这是“我需要中断多个循环”在这种情况下,
goto
可能是可以防御的。但是,使用另一个函数和返回进行抽象可能更可取。不能肯定这在完整的代码实现中是有意义的,但在本例中,
break;
代替
goto close;
会引起较少的注意。您可以在
集中节省一些混乱_TimeOutOutto将你的标志转换成 STD::原子< /代码>。由于缺少排序,整个事件只是一堆未定义的行为。如果你重读C++书中的所有章节,详细讨论互斥、条件变量和排序,那么就要从头开始重写它。如果我错了,avchik可以纠正我,但例如,我认为编译器在(用户想要线程)时提升
,是完全合法的{
位退出循环,并且只加载
用户想要的线程的值一次
,因为其他任何东西都不允许更改它,因为它不以任何方式同步。
中断
只中断最近的循环。外部循环不受影响。这是“我需要中断多个循环”一个
goto
的情况可能是可以防御的。但是,使用另一个函数和返回进行抽象可能更可取。原子值需要公开吗?@vidsac no。我只是试图尽可能地消除不必要的复杂性。隐藏变量和使用访问器与您遇到的问题无关,这会导致错误e就你的问题和我的答案而言,更复杂。太棒了,谢谢。我会在这里报告;)@vidsac但是,你可能会遇到的一个问题是,无法使用默认的复制构造函数复制包含原子的对象。按照你的方式校准std::thread似乎需要复制-你将注意,我把它改为一个lambda,它通过引用而不是通过valueya捕获t。我遇到了这个问题,但幸运的是你的建议解决了它:)非常感谢你的帮助!原子值需要公开吗?@vidsac no。我只是想尽可能地消除不必要的复杂性。隐藏变量并拥有一个访问器并不是一个简单的问题与您遇到的问题相关,它使代码对于您的问题和我的答案来说更加复杂。太棒了,谢谢。将在此处尝试并报告;)@vidsac但是,您可能遇到的一个问题是,无法使用默认的复制构造函数复制包含原子的对象。校准似乎需要复制std::thread按照您的方式执行-您会注意到我将其更改为通过引用而不是valueya捕获t的lambda,我遇到了这个问题,但幸运的是您的建议解决了它:)非常感谢您的帮助!