初识C++11 中的线程操作

来源:互联网 发布:个人开发者 知乎 编辑:程序博客网 时间:2024/05/29 15:47

通过几个例子测试线程操作的效果.以下为测试用的代码. 开发使用的是VS2013.



#include <thread>#include <iostream>#include <vector>#include <mutex>/*------------------------简单的线程创建-----------------------*/void Hello(){std::cout << "Hello from thread " << std::endl;}void TestThread(){std::thread t1(Hello);t1.join();std::cout << "Main Thread" << std::endl;}/*------------------------简单的线程创建-----------------------*///创建了多个子线程,并使用了get_id()方法来获取当前线程的id// 并使用了Lamda表达式/*------------------------多个子线程-----------------------*/void TestMultiThread(){std::vector<std::thread> threads;for (int i = 0; i < 5; ++i){threads.push_back(std::thread([](){std::cout << "Hello from lamda thread " << std::this_thread::get_id() << std::endl;} ));}for (auto& thread : threads){thread.join();}std::cout << "Main Thread" << "\t" << std::this_thread::get_id() << std::endl;}/*------------------------多个子线程-----------------------*//*------------------------测试线程睡眠-----------------------*/void TestSleepForThread(){std::mutex m;std::thread t1([&m](){std::this_thread::sleep_for(std::chrono::seconds(10));for (int i = 0; i < 10; i++){m.lock();std::cout << "In t1 ThreadID : " << std::this_thread::get_id() << " : " << i << std::endl;m.unlock();}});std::thread t2([&m](){std::this_thread::sleep_for(std::chrono::seconds(1));for (int i = 0; i < 10; i++){m.lock();std::cout << "In t2 ThreadID :  " << std::this_thread::get_id() << ": " << i << std::endl;m.unlock();}});t1.join();t2.join();std::cout << "Main Thread :" << std::this_thread::get_id() << std::endl;}/*------------------------测试线程睡眠-----------------------*//*------------------------关于线程的执行顺序问题-----------------------*///定义计算器struct Counter{std::mutex mtx;int value;Counter(): value(0){}void Increment(){////mtx.lock();  解开注释正常++value;//mtx.unlock();}void Decrement(){//使用线程锁mtx.lock();--value;mtx.unlock();}};void TestThreadRunOrder(){Counter counter;std::vector<std::thread > threads;for (int i = 0; i < 5; i++){threads.push_back(std::thread([&](){for (int i = 0; i < 10000; i++){counter.Increment();}}));}for (auto& thread : threads){thread.join();}std::cout << counter.value << std::endl;std::cout << "Main Thread " << std::endl;}/*------------------------关于线程的执行顺序问题-----------------------*/int main(){//简单的线程创建//TestThread();//多个子线程的情况 //TestMultiThread(); -- 有问题没有解决, 打印的顺序有问题//测量sleapfor 及线程锁//TestSleepForThread();//测试线程的执行顺序问题//TestThreadRunOrder();system("pause");return 0;}


原创粉丝点击