[C ++] Будет ли это правильным подходом для функции сна в потоке? - PullRequest
1 голос
/ 14 декабря 2010

Я хотел бы реализовать функцию 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;
    }
};

И, как вы, вероятно, можете разобраться, это моя функция сна ():

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

Но приведет ли это к тому, что фактический поток, содержащийся в этом экземпляре потока, будет спать в течение указанного количества миллисекунд?

С наилучшими пожеланиями, Вениамин:).

EDIT:

Итак, согласно atzz, я мог бы определить функцию сна как статическую функцию-член, и у меня был бы этот вызов :: SleepEx (), и это позволило бы мне вызывать его так:

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

и тогда это приведет к тому, что поток, выполняющий «тестовый» исполняемый объект, будет спать 1000 миллисекунд?

Ответы [ 4 ]

2 голосов
/ 14 декабря 2010

Он переведет в режим сна , какой бы поток ни вызвал эту функцию-член .

1 голос
/ 14 декабря 2010

Нет, это приведет к тому, что исходный поток перейдет в спящий режим, а не тот, который вы начали.

0 голосов
/ 14 декабря 2010

Если вам нужно приостановить только что созданный поток, вы должны использовать SuspendThread или передать CREATE_SUSPENDED в _beginthreadex(), но в некоторых случаях это может привести к взаимоблокировке

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

0 голосов
/ 14 декабря 2010

Да, будет - при условии, что он вызывается из этого потока (то есть из thread::run()). В связи с этим я бы рекомендовал сделать sleep() защищенной функцией-членом.

Или, в качестве альтернативы, сделать его статическим методом с семантикой thread::sleep(), которая является службой, которая приостанавливает вызывающий поток (этот подход используется, например, в стандартной библиотеке Java).

Невозможно заставить спящий поток, кроме вызывающего потока, потому что поток может быть в середине чего-то в этот момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...