[C ++]这是一个线程中'睡眠'函数的有效方法吗?

时间:2010-12-14 10:49:33

标签: c++ windows multithreading

我想在我的线程类中实现一个sleep()函数,但我不知道这是否是一种有效/正确的方法。 这是我的整个线程类(thread.h):

#include <process.h>

struct RUNNABLE{
    virtual void run() = 0;
};

class thread{
public:
    void start(void *ptr){
        DWORD thr_id;
        HANDLE thr_handl = (HANDLE)_beginthreadex(NULL, 0, thread_proc, ptr, 0, (unsigned int*)&thr_id);
    }

    void sleep(int sleep_time, bool alertable){
        SleepEx(sleep_time, alertable);
    }
private:
    static unsigned int __stdcall thread_proc(void *param){
        ((RUNNABLE*)param)->run();
        _endthreadex(0);
        return 0;
    }
};

因为你可能能够理清,这是我的sleep()函数:

void sleep(int sleep_time, bool alertable){
    SleepEx(sleep_time, alertable);
}

但是这会使这个线程实例中包含的实际线程睡眠指定的毫秒数吗?

祝你好运, 本杰明:)。

编辑:

所以根据atzz的说法,我可以将sleep函数定义为静态成员函数,并调用:: SleepEx(),这样我就可以这样调用它:

class test : RUNNABLE{
    virtual void run(){
        printf("hi");
        thread::sleep(1000, false);
    }
};

然后那会导致执行'test'的线程runnable睡眠1000毫秒吗?

4 个答案:

答案 0 :(得分:2)

无论哪个线程调用此成员函数 ,它都会进入

答案 1 :(得分:1)

不,这会让原始线程进入休眠状态,而不是你开始的线程。

答案 2 :(得分:0)

是的,只要它从该线程调用(即从thread::run()内)。 因此,我建议将sleep()作为受保护的成员函数。

或者,作为替代方案,使其成为一个静态方法,语义thread::sleep()是暂停调用线程的服务(例如,在Java标准库中使用此方法)。

除了调用线程休眠之外,不可能做其他事情,因为线程可以在那个时刻处于某事的中间。

答案 3 :(得分:0)

如果您需要暂停新创建的主题,则应使用SuspendThread代替CREATE_SUSPENDED_beginthreadex() {{1}},但在某些情况下会导致死锁

请参阅http://msdn.microsoft.com/en-us/library/ms686345%28v=VS.85%29.aspx