91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

多線程的坑--volatile

發布時間:2020-07-17 08:41:40 來源:網絡 閱讀:530 作者:zy20140925 欄目:編程語言

多線程編程中 開優化選項時要謹慎否則容易掉坑里
先看下面的代碼,開起兩個線程,第二個線程把第一個線程的循環條件置成false 按邏輯來說這個應該能順利結束的不過如果用
g++ -O3 -o multiThread multiThread.cpp -lpthread
編譯的話TestThread1是退不出來的,只有 g_brun 加上 volatile關鍵字才能正常退出
因為在-O3優化選項下 執行TestThread1時g_brun會先讀到寄存器中,編譯器發現這個函數中g_brun沒有任何改變所以不會再去內存中取值直接用寄存器中的備份,在TestThread2中改變了g_brun在內存中的值,對TestThread1中g_brun的寄存器備份沒有任何影響。
加上volatile表示對該變量不優化每次都去內存中取值。

#include <pthread.h>
#include <iostream>
#include <unistd.h>
using namespace std;

//volatile bool g_brun = true;
bool g_brun = true;

void* TestThread1(void* arg)
{
    cout << "TestThread1 進入" << endl;

    long long ll = 0;
    while(g_brun)
        ll ++; 

    cout << "TestThread1 退出   ll:" << ll << endl;
}

void* TestThread2(void* arg)
{
    cout << "TestThread2 進入" << endl;
    g_brun = false;
    cout << "TestThread2 退出  設置 g_brun = false" << endl;
}

int main()
{
    pthread_t threadId1;
    pthread_create(&threadId1, NULL, TestThread1, NULL);
    usleep(1000000); // 保證TestThread1先執行
    pthread_t threadId2;
    pthread_create(&threadId2, NULL, TestThread2, NULL);

    pthread_join(threadId1,NULL);
    pthread_join(threadId2,NULL);

    return 0;
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东丽区| 阆中市| 海盐县| 张家川| 阿拉善右旗| 都昌县| 行唐县| 星子县| 河曲县| 象州县| 鞍山市| 射洪县| 东光县| 苏州市| 隆回县| 塔城市| 克东县| 安溪县| 翁源县| 福泉市| 嵩明县| 镇康县| 井研县| 宜宾县| 祁东县| 都昌县| 阳高县| 临洮县| 思茅市| 金乡县| 长寿区| 阿巴嘎旗| 康保县| 商都县| 双流县| 清丰县| 屯留县| 孝感市| 呼伦贝尔市| 万盛区| 板桥市|