1. 程式人生 > 其它 >C++多程序不加鎖訪問相同變數

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