C ++类中的线程

时间:2016-06-08 14:44:17

标签: c++ multithreading

我以前在C ++上编码,但现在决定回忆旧技能并实现一些新技能:D

现在我正在尝试用C ++重写我的C#程序,并且发生了一个问题 - 我不知道如何使用类方法和从类中调用方法来管理线程,甚至不知道如何创建它们。

class MyObj {
private:
    void thread() {
        while (true) {
            std::string a;
            cin >> a;
        }
    }

    static DWORD static_entry(LPVOID* param) {
        MyObj *myObj = (MyObj*)param;
        myObj->thread();
        return 0;
    }

public:
    void start() {
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)static_entry, this, 0, NULL);
    }
};

这是样本,我在这里找到了,在StackOverflow上但是'void thread()'是空函数,我已经添加了代码,如上所示,但线程似乎立即启动和关闭。

2 个答案:

答案 0 :(得分:2)

  

我已经添加了上面给出的代码,但线程似乎立即开始和关闭。

那是因为你不等待线程在主线程中完成。

从他们的documentation开始,您需要添加类似

的内容
// Wait until all threads have terminated. 
WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

对于std::thread,这应该是对std::thread::join()的调用。

我建议使用std::thread作为MyObj类的成员:

class MyObj {
private:
    void thread_fn() {
        while (true) {
            std::string a;
            cin >> a;
        }
    }

    std::thread t;

public:
    void start() {
        t = std::thread(&MyObj::thread_fn,*this);
    }
    ~MyObj() {
       if(t.joinable())
           t.join();
    }
};

答案 1 :(得分:1)

感谢您的回答。 使用 std :: thread 比使用CLI Tread类更容易。

static void input() {
    while (true) {
        std::string a;
        cin >> a;
        secureProg::execute_command(a);
    }
}

auto start() {
    std::thread thread(secureProg::input);
    thread.join();  
    return thread.get_id();
}

线程从 main

开始
secureProg a;
    auto thread_ptr = a.start();

最终版本(我希望)在类

中的两个方法