C++11 多线程

来源:互联网 发布:c 11 并行编程 编辑:程序博客网 时间:2024/05/02 09:18
#include <thread>#include <iostream>#include <vector>#include <mutex>//线程测试一void Test1(void);//线程测试二void Test2(void);//线程测试三void Test3(void);//线程测试四void Test4(void);int main(){//Test1();//Test2();//Test3();Test4();return 0;}void hello(){std::cout << "Hello from thread " << std::endl;return;}//线程测试一void Test1(void){//通过thread 类直接申明一个线程t1,参数是这个线程执行的回调函数的地址,通过jion()方法阻塞主线程,直到t1线程执行结束为止。std::thread t1(hello);t1.join();std::cout << "Main Thread" << std::endl;return;/*Hello from threadMain Thread请按任意键继续. . .*/}//线程测试二void Test2(void){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;return;/*Hello from lamda thread 1208Hello from lamda thread 3032Hello from lamda thread 1184Hello from lamda thread 4872Hello from lamda thread 4648Main Thread     2072请按任意键继续. . .*/}//线程测试三void Test3(void){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::endl;return;/*In t2 ThreadID : 1864:0In t2 ThreadID : 1864:1In t2 ThreadID : 1864:2In t2 ThreadID : 1864:3In t2 ThreadID : 1864:4In t2 ThreadID : 1864:5In t2 ThreadID : 1864:6In t2 ThreadID : 1864:7In t2 ThreadID : 1864:8In t2 ThreadID : 1864:9In t1 ThreadID : 1848:0In t1 ThreadID : 1848:1In t1 ThreadID : 1848:2In t1 ThreadID : 1848:3In t1 ThreadID : 1848:4In t1 ThreadID : 1848:5In t1 ThreadID : 1848:6In t1 ThreadID : 1848:7In t1 ThreadID : 1848:8In t1 ThreadID : 1848:9Main Thread请按任意键继续. . .*/}struct Counter {std::mutex mutex;int value;Counter() : value(0) {}void increment(){// mutex.lock();                【1】表示没有使用锁++value;// mutex.unlock();              【1】}void decrement(){mutex.lock();--value;mutex.unlock();}};//线程测试四void Test4(void){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();counter.decrement();}}));}for (auto& thread : threads){thread.join();}std::cout << counter.value << std::endl;return;/*由于创建线程是使用lambda表达式,并使用引用的方式访问counter这个变量,当没有使用lock来保护的时候(情况【1】),执行的结果可能不像预期的5000(程序的意思是每个线程使counter中的value自加1000次,5个线程运行结束的时候应该是5000),当没有使用锁的时候自加的操作可能被其他线程打断,因此结果可能会小于5000。*/}

0 0
原创粉丝点击