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;
}

第一次执行:

 

第二次执行:

 

第三次执行:

可以看出,在针对同一变量多个进程的访问同时读不会产生问题,如果同时去写就不能保证数据正确修改或者读取到。

posted @ 2021-08-29 20:56  Jcpeng_std  阅读(822)  评论(0编辑  收藏  举报