2016-08-02 3 views
2

Я пишу библиотеку C++, чтобы позволить программам разговаривать со службой в облаке. Я хочу запустить фоновый поток, который периодически проверяет сервер и перезапускает его в случае сбоя. Однако было бы неплохо, если бы основная программа вне библиотеки не беспокоилась о начале потока. Использование библиотеки должно быть ограничено useProcess(). К этому моменту поток уже должен работать.Как начать поток C++ при запуске программы?

Как начать поток без основной программы, требующей вызова каких-либо функций? Есть ли способ сделать это в статическом конструкторе моего класса сервиса, чтобы он запускал поток при запуске программы (как я бы сделал на Java)?

ответ

10

Вы можете сделать это именно таким образом - вы можете иметь глобальный объект, конструктор которого запускает поток при запуске программы.

Лично я считаю, что наличие библиотеки запускает поток неожиданно - это не очень хорошая идея, но вполне возможно, что это имеет смысл в вашем случае использования. Обязательно задокументируйте точные требования потока, как его закрыть и т. Д. Все потоки в процессе должны сотрудничать.

Пример кода:

#include <cstdio> 

//--------- BEGIN LIBRARY 
class MyThread 
{ // The real code goes here 
public: 
    MyThread() 
    { printf("A MyThread has been constructed\n"); } 
    ~MyThread() 
    { printf("A MyThread has been destroyed\n"); } 
    void Start() 
    { printf("A MyThread has been started\n"); } 
    void Stop() 
    { printf("A MyThread has been stopped\n"); } 
}; 

class MyThreadCreator 
{ // Just a helper class to construct/start/stop/destroy the other 
public: 
    MyThread thread; 
    MyThreadCreator() { thread.Start(); } 
    ~MyThreadCreator() { thread.Stop(); } 
}; 
MyThreadCreator p; 
//---------- END LIBRARY 

int main() 
{ 
    printf("Main\n"); 
    return 0; 
} 

MyThread был построен
A MyThread был запущен
Главная
MyThread был остановлен
MyThread был разрушен

+1

что бы вы рекомендовали вместо этого? – Drgabble

+0

также могу получить быстрый пример, пожалуйста? – Drgabble

+0

@Drgabble Я бы рекомендовал иметь функции, которые запускают и останавливают поток, который могут вызвать те, кто использует вашу библиотеку. –

Смежные вопросы