青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

對于多線程編程,很多人概念不清,寫代碼的時候要么是處處加鎖,影響性能不說,還容易莫名其妙的死鎖,還有人對多線程敬而遠之。

所以學習多線程編程最重要的不是學習API,而是理解什么才是多線程安全的代碼

從例子說起
#include?<windows.h>
#include?
<process.h>

long?global1?=?0;
volatile?long?global2?=?0;

class?MyClass
{
public:
????MyClass()?:?m(
0)
????{
????????
++m;
????}

????
int?fun(int?v)
????{
????????
return?m+v;?//-----------9
????}

????
void?set(int?v)
????{
????????m?
=?v;???//-------------10
????}
????
int?m;
};

MyClass?global_object;?
//-------------8

unsigned?
int?__stdcall?thread_fun1(void?*param)
{
????
static?int?static2?=?0;
????
static?MyClass?static_object;?//--------6
????int?local1?=?0;
????
????
++local1;?????//-------1
????++static2;????//-------2
????++global1;????//-------3
????++global2;????//-------4
????InterlockedIncrement(&global1);?//--------5

????local1?
=?global_object.fun(local1);?//----------7

????global_object.
set(local1);?//---------------11

????
return?0;
}


unsigned?
int?__stdcall?thread_fun2(void?*param)
{
????
++global1;????//-------3
????++global2;????//-------4
????InterlockedIncrement(&global1);?//--------5

????global_object.
set(1);?//-----------11
????return?0;
}


int?main()
{
????HANDLE?thread1?
=?(HANDLE)_beginthreadex(0,0,&thread_fun1,0,0,0);?//thread?1
????HANDLE?thread2?=?(HANDLE)_beginthreadex(0,0,&thread_fun1,0,0,0);?//thread?2
????HANDLE?thread3?=?(HANDLE)_beginthreadex(0,0,&thread_fun2,0,0,0);?//thread?3
????
????WaitForSingleObject(thread1,INFINITE);
????WaitForSingleObject(thread2,INFINITE);
????WaitForSingleObject(thread3,INFINITE);
????
????
return?0;
}




1.局部變量局部使用是安全的
為什么?因為每個thread 都有自己的運行堆棧,而局部變量是生存在堆棧中,大家不干擾。
所以代碼1
int local1;
++local1;
是安全的

2.全局原生變量多線程讀寫是不安全的
全局變量是在堆(heap)中
long global1 = 0;
++global2;
++這個操作其實分為兩部,一個是讀,另外一個是寫
?mov???????? ecx,global
?add???????? ecx,1
?mov???????? global,ecx
所以代碼3處是不安全的

3.函數靜態變量多線程讀寫也是不安全的
道理同2
所以代碼2處也是不安全的

4.volatile能保證全局整形變量是多線程安全的么
不能。
volatile僅僅是告誡compiler不要對這個變量作優化,每次都要從memory取數值,而不是從register
所以代碼4也不是安全

5.InterlockedIncrement保證整型變量自增的原子性
所以代碼5是安全的

6.function static object的初始化是多線程安全的么
不是。
著名的Meyer Singleton其實不是線程安全的
Object & getInstance()
{?
???? static Object o;
???? return o;
}
可能會造成多次初始化對象
所以代碼6處是不安全的

7.在32機器上,4字節整形一次assign是原子的
比如
i =10; //thread1
i=4; //thread2
不會導致i的值處于未知狀態,要么是10要么是4


寫好多線程安全的法寶就是封裝,使數據有保護的被訪問到
安全性:
局部變量>成員變量>全局變量
Posted on 2006-11-30 16:11 艾凡赫 閱讀(3047) 評論(4)  編輯 收藏 引用 所屬分類: 多線程C++

Feedback

# re: 什么代碼才是線程安全的  回復  更多評論   

2008-02-25 16:28 by badboyfind
請問:您對
function static object的初始化是多線程安全的么
不是。
著名的Meyer Singleton其實不是線程安全的
Object & getInstance()
{
static Object o;
return o;
}
可能會造成多次初始化對象
所以代碼6處是不安全的

認識深刻嗎?
對于Meyer Singleton,你有沒有實際監測過,我只是通過<Effective C++>中條款3了解到Meyer Singleton。可是對于上面的“可能造成多次初始化對象”,能不能做更加詳細的闡述,可不可以進一步舉例示范?

可以回復我的郵箱: sincere_listen@163.com
急需知道答案!

# re: 什么代碼才是線程安全的  回復  更多評論   

2008-02-25 17:45 by 愛飯盒
MyClass() : m(0)
{
++m;
}
問題出在這里;

上面又說:
++這個操作其實分為兩部,一個是讀,另外一個是寫
mov ecx,global
add ecx,1
mov global,ecx
當為多線程時,MyClass構造函數可能會被調用多次:舉個例子


class MyClass2
{
public:
MyClass2()
{
m++;
//如果去掉sleep,則第二次調用函數func()時不會再進入構造函數,所以要線程安全,要防止代碼同時進入這里.
sleep(10);
cout<<"MyClass2:"<<m<<endl;
}
int m;
void func(){ cout<< "func:"<<m<<endl;}
};
void func()
{
static MyClass2 o2;
o2.func();
}
int main()
{
func();
cout<<"################"<<endl;
func();
return 0;
}

# re: 什么代碼才是線程安全的  回復  更多評論   

2008-02-25 17:51 by 愛飯盒
這里對同時進入一段代碼使用sleep()進行放大處理,實際應用時,單單一個++m,也可能會同時多個線程訪問.只是++m不太好測試.

# re: 什么代碼才是線程安全的  回復  更多評論   

2008-02-25 18:03 by 愛飯盒
呵呵,剛才代碼貼的不對,多線程的沒貼出來,在多線程時能體現出來這點,單線程體現不出來.
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情中文字幕一区二区 | 久久精品噜噜噜成人av农村| 亚洲日本免费| 欧美大片在线观看一区二区| 欧美暴力喷水在线| 91久久精品国产91性色tv| 亚洲人成精品久久久久| 在线视频你懂得一区二区三区| 亚洲视频一区在线观看| 午夜亚洲影视| 麻豆精品一区二区av白丝在线| 欧美成人一区在线| 欧美视频在线视频| 精品91视频| 亚洲精品影院| 亚洲欧美在线x视频| 久久看片网站| 亚洲精品影视| 久久成人这里只有精品| 欧美精品久久一区| 国产一区二区高清不卡| 亚洲美女在线视频| 欧美一区二区日韩一区二区| 欧美.日韩.国产.一区.二区| 亚洲视频观看| 免费一级欧美片在线播放| 乱中年女人伦av一区二区| 亚洲精品久久久久久久久久久久久| 亚洲影院高清在线| 欧美国产一区二区在线观看 | 一区在线影院| 亚洲制服av| 欧美激情精品久久久久久免费印度 | 欧美日韩色一区| 在线观看欧美日韩国产| 午夜精品久久久久久久久久久| 欧美18av| 久久成人18免费网站| 欧美午夜精品久久久| 亚洲日本成人| 蜜臀va亚洲va欧美va天堂| 亚洲午夜激情免费视频| 欧美日本国产在线| 亚洲巨乳在线| 欧美韩日一区二区| 久久久久9999亚洲精品| 国产精品一区二区三区观看| 一区二区电影免费观看| 亚洲国产日韩欧美在线动漫| 久久精品一区二区三区中文字幕 | 亚洲精品乱码久久久久| 裸体一区二区| 久久久久久**毛片大全| 国产一区二区丝袜高跟鞋图片 | 欧美一级视频| 在线视频精品| 国产精品久久久久久久久免费| 日韩视频在线一区二区三区| 欧美 亚欧 日韩视频在线| 欧美一区亚洲| 国产有码在线一区二区视频| 久久精品国产亚洲aⅴ| 西瓜成人精品人成网站| 国产欧美视频一区二区| 欧美一区二区三区免费观看| 亚洲午夜精品久久| 国产精品一区二区久久| 久久精品国产精品亚洲| 欧美一区二区免费| 伊人成人网在线看| 欧美激情精品久久久久久黑人 | 欧美日韩视频在线| 亚洲在线一区| 老司机67194精品线观看| 久久福利影视| 亚洲国产一区二区三区在线播| 欧美成人一区二区三区| 欧美国产先锋| 亚洲一区在线免费| 欧美一级欧美一级在线播放| 韩国成人福利片在线播放| 久久中文欧美| 欧美经典一区二区三区| 亚洲欧美日韩一区在线| 久久成人免费日本黄色| 亚洲人精品午夜| 亚洲香蕉成视频在线观看 | 午夜精品国产精品大乳美女| 亚洲欧美日韩综合国产aⅴ| 国内免费精品永久在线视频| 亚洲国产黄色片| 国产精品看片你懂得| 久久艳片www.17c.com| 欧美激情中文字幕乱码免费| 亚洲欧美国产高清| 久久视频在线免费观看| 亚洲午夜在线| 久久裸体视频| 亚洲欧美日韩一区二区在线 | 亚洲视频免费看| 伊人久久亚洲热| 制服丝袜激情欧洲亚洲| 亚洲高清激情| 午夜视频在线观看一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 日韩一级二级三级| 精品动漫一区| 亚洲一区二区毛片| 99热精品在线| 浪潮色综合久久天堂| 欧美亚洲尤物久久| 欧美日韩国内自拍| 欧美黑人多人双交| 一区二区三区在线不卡| 亚洲一区二区在线视频| 亚洲靠逼com| 久久影视三级福利片| 欧美一级成年大片在线观看| 欧美不卡视频一区| 久久深夜福利| 国产一区二区按摩在线观看| 一区二区三区日韩| 一区二区免费在线观看| 男女激情视频一区| 免费亚洲电影| 伊人狠狠色j香婷婷综合| 午夜国产精品视频免费体验区| 一个色综合av| 欧美激情网站在线观看| 欧美高清不卡在线| 在线免费精品视频| 久久久久一区二区三区| 久久青草久久| 伊人久久大香线蕉综合热线 | 国产精品专区h在线观看| 亚洲日本一区二区三区| 久久久免费av| 国产精品亚洲不卡a| 一区二区三区日韩在线观看| 99成人在线| 欧美日韩第一区| 亚洲精品中文字幕在线观看| 日韩一级裸体免费视频| 欧美乱人伦中文字幕在线| 亚洲黄色天堂| 在线中文字幕一区| 国产精品欧美日韩一区| 亚洲欧美日韩在线一区| 久久gogo国模裸体人体| 国产日韩在线视频| 久久久久久综合| 亚洲电影毛片| 亚洲午夜视频| 国内精品伊人久久久久av一坑| 久久久999精品| 欧美黄色免费| 午夜精品在线视频| 伊人久久男人天堂| 欧美另类一区| 性欧美超级视频| 亚洲福利视频三区| 亚洲已满18点击进入久久| 国产日韩欧美视频| 欧美sm极限捆绑bd| 夜夜爽www精品| 麻豆91精品91久久久的内涵| 日韩视频在线观看一区二区| 欧美性开放视频| 久久精品夜色噜噜亚洲aⅴ| 亚洲国产精品一区| 亚洲欧美国产高清va在线播| 一区二区在线视频| 国产精品va在线播放我和闺蜜| 久久国产99| 中国女人久久久| 欧美高清不卡在线| 欧美在线观看视频一区二区三区 | 极品少妇一区二区三区| 欧美视频在线观看| 久久综合久久美利坚合众国| 一区二区欧美激情| 欧美国产日本高清在线| 欧美一级视频| 这里只有精品视频| 亚洲国产欧美国产综合一区 | 黄色亚洲网站| 欧美日韩一二区| 玖玖玖国产精品| 午夜精品亚洲| 在线一区二区三区四区| 91久久精品日日躁夜夜躁国产| 久久女同精品一区二区| 午夜精品久久久久久久| 一区二区三区回区在观看免费视频| 一区视频在线看| 国产一区欧美日韩| 国产欧美丝祙| 国产精品视频yy9299一区| 欧美日韩免费在线| 欧美黄色免费|