本文为c++11中std::thread的简单使用示例,请看代码:
#include <iostream>
#include <thread>
#include <chrono>
static bool g_bRun = false;
void pfnThreadFunc1()
{
unsigned int uiCnt = 0;
while (g_bRun)
{
if (0 == ++uiCnt % 100)
{
std::cout << "Thread 1 count: " << uiCnt << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(5));
}
std::cout << "Thread 1 stoped" << std::endl;
return;
}
void pfnThreadFunc2()
{
unsigned int uiCnt = 0;
while (g_bRun)
{
if (0 == ++uiCnt % 500)
{
std::cout << "Thread 2 count: " << uiCnt << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(2));
}
std::cout << "Thread 2 stoped" << std::endl;
return;
}
class Timer
{
public:
void work(int iVal)
{
while (g_bRun)
{
std::cout << "Timer::work, value: " << iVal << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return;
}
};
class Manager
{
public:
static Manager* instance()
{
static Manager objManager;
return (&objManager);
}
void work(int iVal)
{
while (g_bRun)
{
std::cout << "Manager::work, value: " << iVal << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return;
}
private:
Manager() {}
~Manager() {}
};
int main(int argc, char **argv)
{
//std::cout << "Test ok!!!" << std::endl;
g_bRun = true;
std::thread objThread1, objThread2;
objThread1 = std::thread(pfnThreadFunc1);
objThread2 = std::thread(pfnThreadFunc2);
objThread1.detach(); // 分离式线程,独立运行
objThread2.detach(); // 分离式线程,独立运行
Timer* pTimer = new (std::nothrow) Timer();
if (pTimer)
{
std::thread objThread3(&Timer::work, pTimer, 52);
objThread3.detach();
}
std::thread objThread4(&Manager::work, Manager::instance(), 13);
objThread4.detach();
std::thread thLambda1([](){std::cout << "helle lambad thread." << std::endl;});
std::thread thLambda2([](int a, double b){std::cout << a << ', ' << b << std::endl;}, 1, 2);
std::this_thread::sleep_for(std::chrono::seconds(30));
g_bRun = false;
//objThread1.join(); // 线程阻塞,直到被回收
//objThread2.join(); // 线程阻塞,直到被回收
//objThread3.join(); // 线程阻塞,直到被回收
//objThread4.join(); // 线程阻塞,直到被回收
getchar();
delete pTimer;
pTimer = nullptr;
return 0;
}