Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.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,我正在读布鲁斯·埃克尔的书,在做第11章的练习13时,我遇到了一个问题 练习13:创建两个可运行的子类,其中一个包含启动并调用wait的运行。另一个类的运行应该捕获第一个可运行对象的引用。它的运行应该在几秒钟后调用第一个线程的信号,以便第一个线程可以打印消息 Runnable类来自库 这是我的密码: #include <iostream> #include "zthread/Runnable.h" #include "zthread/Condition.h" #include "zt

我正在读布鲁斯·埃克尔的书,在做第11章的练习13时,我遇到了一个问题

练习13:创建两个可运行的子类,其中一个包含启动并调用wait的运行。另一个类的运行应该捕获第一个可运行对象的引用。它的运行应该在几秒钟后调用第一个线程的信号,以便第一个线程可以打印消息

Runnable类来自库

这是我的密码:

#include <iostream>
#include "zthread/Runnable.h"
#include "zthread/Condition.h"
#include "zthread/Mutex.h"
#include "zthread/Guard.h"
#include "zthread/CountedPtr.h"
#include "zthread/Thread.h"

class Class1: public ZThread::Runnable {
    ZThread::Mutex lock;
    ZThread::Condition condition;
public:
    Class1(): condition(lock) {}

    void run() {
        ZThread::Guard<ZThread::Mutex> g(lock);
        std::cout << "Class1::run()\n";
        condition.wait();
        std::cout << "Message\n";
    }

    void continue1() {
        ZThread::Guard<ZThread::Mutex> g(lock);
        std::cout << "Class1::continue1()\n";
        condition.signal();
    }
};

class Class2: public ZThread::Runnable {
    ZThread::CountedPtr<Class1>& c;
public:
    Class2(ZThread::CountedPtr<Class1>& c1): c(c1) {}

    void run() {
        std::cout << "Class2::run()\n";
        ZThread::Thread::sleep(2000);
        std::cout << "Calling continue1()\n";
        c->continue1();
        std::cout << "Exiting Class2::run()\n";
    }
};

int main() {
    ZThread::CountedPtr<Class1> c(new Class1);
    std::cout << "Starting thread 1\n";
    ZThread::Thread t1(c);
    std::cout << "Starting thread 2\n";
    ZThread::Thread t2(new Class2(c));
    std::cout << "exit\n";
}

它挂起并且不打印消息。我做错了什么?

您的程序以函数main结束,两个线程都被中断。将睡眠添加到主函数的末尾

它打印什么?考虑使用STD::CURR,它不缓冲,或者更好地使两个类都构造为使用目标STD::OsStand和Debug输出成员。我不知道ZThread::Guard是如何工作的,但你同时在两个线程中都使用它……我可能愚蠢地认为ZThread的析构函数是连接的,但唉,我可能错了,因为我对那个环境完全不熟悉。我希望在输出中看到退出,但到目前为止,我们被告知的只是一件没有打印出来的东西;不是以前那样。我也不太熟悉。我不确定线程是否因为程序挂起而中断。但睡眠或性病在主食结束时有帮助。谢谢