C++多进程不加锁访问相同变量
C++11线程库:原始的c++标准仅支持单线程编程,新的C++标准(C++11或C++110x)于2011年发布,引入了新的线程库。
编译器要求:
Linux: gcc 4.8.1 (完全并发支持)
Windows: Visual Studio 2012以上 and MingW
在linux下的编译方法:g++ -std=c++11 sample.cpp -lpthread
在c++11中创建线程:在每个c++应用程序中,都有一个默认的主线程,即main函数,在c++11中,我们可以通过创建std::thread类的对象来创建其他线程,每个std :: thread对象都可以与一个线程相关联。
需包含头文件<thread>,可以使用std :: thread对象附加一个回调,当这个新线程启动时,它将被执行。 这些回调可以是:
1)函数指针;
2)函数对象;
3)Lambda函数。
线程对象可以这样创建:std::thread thObj(<CALLBACK>)
新线程将在创建新对象后立即开始,并且将与已启动的线程并行执行传递的回调。此外,任何线程可以通过在该线程的对象上调用join()函数来等待另一个线程退出。看一个主线程创建单独线程的例子,创建完新的线程后,主线程将打印一些信息并等待新创建的线程退出。
下面针对多进程访问相同变量进行了编码并测试:
一、不同时读写
#include <iostream> #include <thread> using namespace std; int x = 0; void setX(int val) { x = val; } void getX() { cout << "X = " << x; } int main() { thread t1(setX, 3); thread t2(getX); cout << "Thread 1 ID: " << t1.get_id() << endl << "Thread 2 ID: " << t2.get_id() << endl; t1.join(); t2.join(); return 0; }
第一次执行:
第二次执行:
第三次执行:
二、同时读写
#include <iostream> #include <thread> using namespace std; int x = 0; void setX(int val) { x = val; } void getX() { cout << "X = " << x << endl; } int main() { thread t1(setX, 3); thread t2(getX); thread t3(setX, 4); thread t4(getX); cout << "Thread 1 ID: " << t1.get_id() << endl << "Thread 2 ID: " << t2.get_id() << endl; cout << "Thread 3 ID: " << t3.get_id() << endl << "Thread 4 ID: " << t4.get_id() << endl; t1.join(); t3.join(); t2.join(); t4.join(); return 0; }
第一次执行:
第二次执行:
第三次执行:
可以看出,在针对同一变量多个进程的访问同时读不会产生问题,如果同时去写就不能保证数据正确修改或者读取到。
本文来自博客园,作者:Jcpeng_std,转载请注明原文链接:https://www.cnblogs.com/JCpeng/p/15203597.html