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

桃源谷

心靈的旅行

人生就是一場旅行,不在乎旅行的目的地,在乎的是沿途的風(fēng)景和看風(fēng)景的心情 !
posts - 32, comments - 42, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
From 2008精選

UNIX上C++程序設(shè)計(jì)守則(6)Add star

準(zhǔn)則6: 遵守多線程編程的常識(shí)


  1. 要準(zhǔn)確把握在POSIX標(biāo)準(zhǔn)的函數(shù)中,那些函數(shù)是非線程安全的,一定不要使用
  2. 要讓自己編寫的函數(shù)符合線程安全
    • 在訪問共享數(shù)據(jù)/變量之前一定要先鎖定
    • 如果使用C++的話,一定要注意函數(shù)的同步方法

說明: (1) 要準(zhǔn)確把握那些非線程安全的函數(shù),一定不要使用


如果在POSIX平臺(tái)上進(jìn)行多線程編程時(shí),有幾個(gè)最基本的知識(shí),也就是所說的“常識(shí)”,希望大家一定要嚴(yán)格遵守。


...首先、我們要理解“線程安全”的意思。線程安全的函數(shù)就是指,“一個(gè)能被在多個(gè)線程同時(shí)調(diào)用也不會(huì)發(fā)生問題的函數(shù)”。這樣的函數(shù)通常要滿足以下幾個(gè)的特質(zhì)。

  1. 不要操作局部的靜態(tài)變量(函數(shù)內(nèi)的static變量)和全局靜態(tài)數(shù)據(jù)(全局變量,函數(shù)外的靜態(tài)變量)。而且,也不要調(diào)用其他的非線程安全的函數(shù)
  2. 如果要操作這樣的變量的話,事先必須使用互斥鎖mutex進(jìn)行同步,否則一定要限制多個(gè)線程同時(shí)對(duì)它的訪問

那么、在POSIX標(biāo)準(zhǔn)的函數(shù)里面,也有不滿足上述條件的。由于歷史遺留問題,一些函數(shù)的識(shí)別標(biāo)識(shí)(signature)的定義沒有考慮到線程安全的問題,所以不管怎么做都不能滿足上述的條件。例如,看看 localtime函數(shù)吧。它的定義的識(shí)別標(biāo)識(shí)(signature)如下:

struct tm *localtime(const time_t *timer);

localtime 函數(shù)是,把一個(gè)用整數(shù)形式表示的時(shí)刻(從1970/1/1到現(xiàn)在為止的秒數(shù))、轉(zhuǎn)換成一個(gè)能讓人容易明白的年月日形式表示出來的tm結(jié)構(gòu)體并返回給調(diào)用者的函數(shù)。根據(jù)規(guī)格說明、返回出來的tm結(jié)構(gòu)體是不需要free()掉,也不能釋放的。這個(gè)函數(shù)典型的實(shí)現(xiàn)就像下面的代碼那樣:

struct tm *localtime(const time_t *timer) {
static struct tm t;

/* ... 從timer參數(shù)里算出年月日等數(shù)值 ... */

t.tm_year = XXX;
/* ...把它們填入到結(jié)構(gòu)體內(nèi)... */
t.tm_hour = XXX;
t.tm_min = XXX;
t.tm_sec = XXX;

return &t;
}

這個(gè)函數(shù)如果被像下面那樣使用的話,就會(huì)有漏洞:

  1. 在線程A里執(zhí)行 ta = localtime(x);
  2. 在線程B里執(zhí)行 tb = localtime(y);
  3. 線程A參照ta結(jié)構(gòu)體里的數(shù)據(jù) → 就發(fā)現(xiàn)這些數(shù)據(jù)是一些奇怪的值!

...在函數(shù)的說明手冊里對(duì)這個(gè)問題也沒有做過詳細(xì)的說明。關(guān)于這個(gè)漏洞,在localtime函數(shù)即使使用了mutex鎖也不能被回避掉。所以,這個(gè)函數(shù)定義的識(shí)別標(biāo)識(shí)是不行滴。
[譯者lymons注:在多個(gè)線程里調(diào)用localtime函數(shù)之所以有問題的原因是,localtime函數(shù)里返回的tm構(gòu)造體是一個(gè)靜態(tài)的結(jié)構(gòu)體,所以在線程A里調(diào)用localtime函數(shù)時(shí),該結(jié)構(gòu)體被賦予正確的值;而在線程A參照這個(gè)結(jié)構(gòu)體之前,線程B又調(diào)用localtime的話,這個(gè)靜態(tài)的結(jié)構(gòu)體又被賦予新的一個(gè)值。因此在線程A對(duì)這個(gè)結(jié)構(gòu)體的訪問都是基于一個(gè)錯(cuò)誤的值進(jìn)行的]


正因?yàn)槿绱耍拖裆厦嬲f過的POSIX規(guī)格(SUSv3)里整齊的

asctime, basename, catgets, crypt, ctime, dbm_clearerr, dbm_close, dbm_delete, dbm_error, dbm_fetch, dbm_firstkey, dbm_nextkey, dbm_open, dbm_store, dirname, dlerror, drand48, ecvt, encrypt, endgrent, endpwent, endutxent, fcvt, ftw, gcvt, getc_unlocked, getchar_unlocked, getdate, getenv, getgrent, getgrgid, getgrnam,

(省略)

對(duì)于在規(guī)格中被定義為非線程安全的函數(shù),應(yīng)該制定一個(gè)避免使用它們的規(guī)則出來,并且制作一個(gè)能夠自動(dòng)檢查出是否使用了這些函數(shù)的開發(fā)環(huán)境,應(yīng)該是比較好的。


反之,在這里沒有被登載的POSIX標(biāo)準(zhǔn)函數(shù)都被假定為 "shall be thread-safe" 的、所以在實(shí)際的使用中可以認(rèn)為在多線程環(huán)境里是沒有問題的(而且在使用的平臺(tái)上沒有特別地說明它是非線程安全的話)。


另外,有幾個(gè)非線程安全的函數(shù),都準(zhǔn)備了一個(gè)備用的線程安全版本的函數(shù)(僅僅是變更了函數(shù)的識(shí)別標(biāo)識(shí))。像這些函數(shù)為了與原版進(jìn)行區(qū)別都在其函數(shù)名后面添加了 _r 這個(gè)后綴*1。例如,asctime函數(shù)就有線程安全版本的函數(shù)asctime_r。在規(guī)格說明中是否定義了備用函數(shù),可以試著點(diǎn)擊剛才的那個(gè)網(wǎng)頁里面的函數(shù)名就可以看到。點(diǎn)擊 rand函數(shù)就可以看到,

[TSF] int rand_r(unsigned *seed);

用[TSF]這樣的文字標(biāo)記出來的函數(shù)吧。這就是備用函數(shù)。在一覽中沒有記載出來的函數(shù)(備注: 稍微有點(diǎn)兒出入。請(qǐng)參照這里)、據(jù)我所知還有下面的備用函數(shù)。

asctime_r, ctime_r, getgrgid_r, getgrnam_r, getpwnam_r, getpwuid_r, gmtime_r, localtime_r, rand_r, readdir_r, strerror_r, strtok_r

還有,在規(guī)格以外,還準(zhǔn)備了很多的下面那樣的函數(shù)。

gethostbyname_r, gethostbyname2_r

在最近的操作系統(tǒng)中、也使用 getaddrinfo API函數(shù)來解決IPv6名字對(duì)應(yīng)的問題。gethostbyname系列的API都是比較陳舊的函數(shù)了、所以使用前面的函數(shù)還是比較好吧*2。根據(jù)規(guī)格SUSv3,getaddrinfo也是線程安全的:

The freeaddrinfo() and getaddrinfo() functions shall be thread-safe.

在多線程編程中,不要使用非線程安全的函數(shù),而他們的備用函數(shù)可以放心地積極的去使用。


后續(xù)

*1:在C言語里函數(shù)不能重載,所以只能添加一個(gè)新的函數(shù)

*2:跟網(wǎng)絡(luò)有關(guān)的API哪些是新的哪些是舊的,可以參考 IPv6網(wǎng)絡(luò)編程 (network technology series) 這本好書

我的個(gè)人簡歷第一頁 我的個(gè)人簡歷第二頁
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩一区二区在线| 99国产精品久久久久老师| 夜夜嗨av一区二区三区网站四季av| 在线亚洲一区二区| 亚洲精品专区| 亚洲激情黄色| 日韩亚洲精品在线| 日韩一区二区精品葵司在线| 亚洲精品中文字幕在线| 一二美女精品欧洲| 亚洲午夜在线观看视频在线| 亚洲无限av看| 久久国产主播| 亚洲国产婷婷| 亚洲高清毛片| 欧美国产国产综合| 亚洲国产第一| 亚洲一区综合| 久久婷婷国产综合国色天香| 老司机午夜精品视频| 亚洲午夜91| 久久精品理论片| 亚洲高清不卡| 欧美一区二区三区男人的天堂| 久久久久99| 国产精品美女www爽爽爽视频| 国产精品一区免费观看| 亚洲精品视频中文字幕| 亚洲——在线| 在线中文字幕日韩| 亚洲精品国产品国语在线app| 蜜臀久久99精品久久久画质超高清 | 国产日本亚洲高清| 国产精品一级在线| 亚洲精品国精品久久99热一| 久久9热精品视频| 99综合在线| 免费日韩视频| 在线电影欧美日韩一区二区私密| 99伊人成综合| 亚洲黄色一区二区三区| 免费不卡在线观看| 国产一区二区三区不卡在线观看| 亚洲性色视频| 亚洲欧美成aⅴ人在线观看| 欧美丝袜一区二区| 香蕉精品999视频一区二区| 一区二区三区欧美视频| 国产精品免费看| 欧美在线观看日本一区| 一区二区三区四区精品| 欧美激情国产精品| 亚洲一级特黄| 国产精品九九| 久久在线视频| 欧美日韩成人在线视频| 欧美影片第一页| 久久av在线| 99re视频这里只有精品| 亚洲欧美日韩人成在线播放| 亚洲电影在线观看| 一区二区三区色| 亚洲国语精品自产拍在线观看| 亚洲精品久久嫩草网站秘色| 国产精品萝li| 制服丝袜亚洲播放| 亚洲精品乱码| 久久久久综合| 欧美有码在线视频| 欧美视频中文字幕| 欧美黄色日本| 亚洲激情女人| 六月丁香综合| 亚洲电影一级黄| 1000部精品久久久久久久久| 新狼窝色av性久久久久久| 亚洲欧美日韩国产综合| 欧美天天在线| 亚洲一区二区三区777| 亚洲婷婷在线| 国产精品久久中文| 亚洲在线一区| 久久高清免费观看| 国产主播一区二区三区| 欧美专区在线| 欧美激情亚洲自拍| 这里只有精品在线播放| 亚洲精品色婷婷福利天堂| 亚洲电影下载| 欧美特黄视频| 性一交一乱一区二区洋洋av| 久久精品在线免费观看| 在线成人免费观看| 欧美视频在线免费| 久久成人亚洲| 亚洲精品无人区| 久久久国产精彩视频美女艺术照福利| 国产九九精品| 欧美成人有码| 久久精品国产69国产精品亚洲| 欧美激情一区在线观看| 亚洲一区二区毛片| 红杏aⅴ成人免费视频| 欧美高清在线精品一区| 99热在线精品观看| 狼人天天伊人久久| 一区二区三区黄色| 亚洲国产日韩综合一区| 国产精品一级久久久| 欧美承认网站| 久久精品一区二区三区四区| 一本色道久久加勒比88综合| 久久久夜夜夜| 欧美一区视频| 久久久久国产精品一区| 亚洲欧美资源在线| 亚洲午夜久久久久久久久电影院| 在线免费观看欧美| 伊人久久男人天堂| 国产精品成人aaaaa网站| 欧美精品在线观看91| 欧美精品在线观看播放| 欧美福利视频| 欧美精品在线观看| 欧美三级中文字幕在线观看| 欧美激情导航| 国产精品女主播一区二区三区| 欧美jizzhd精品欧美巨大免费| 久久精品一区二区三区四区| 久久国产一区| 乱码第一页成人| 亚洲青涩在线| 亚洲区第一页| 亚欧美中日韩视频| 久久―日本道色综合久久| 欧美1级日本1级| 欧美日韩性生活视频| 国产一区二区三区在线观看免费 | 亚洲成人资源| 一本色道久久综合亚洲精品不 | 亚洲欧美一区二区原创| 午夜免费在线观看精品视频| 久久精品女人| 亚洲一区二区三区欧美| 久久婷婷国产麻豆91天堂| 欧美精品激情blacked18| 国产精品日韩久久久久| 91久久久久久久久| 久久久在线视频| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲免费大片| 久久精品视频一| 亚洲视频专区在线| 欧美福利一区| 久久九九热免费视频| 国产精品亚洲综合| 亚洲欧美视频在线观看| 亚洲精品免费在线观看| 欧美激情一区二区三区四区| 在线观看国产欧美| 欧美国产日韩一区| 欧美极品色图| 亚洲婷婷综合久久一本伊一区| 亚洲国产你懂的| 欧美国产在线观看| 一区二区三区免费网站| 亚洲欧洲在线一区| 亚洲一区二区在线播放| 欧美日韩中文在线观看| 午夜精品久久久久久久99水蜜桃 | 欧美影院精品一区| 欧美一区永久视频免费观看| 永久久久久久| 日韩亚洲精品视频| 国产主播喷水一区二区| 亚洲国产精品嫩草影院| 国产精品裸体一区二区三区| 免费观看亚洲视频大全| 国产精品国产精品| 欧美成年人视频网站欧美| 欧美另类一区| 久久综合久久综合九色| 欧美成人一区二区| 久久综合给合久久狠狠狠97色69| 欧美激情网友自拍| 麻豆国产精品一区二区三区| 欧美午夜理伦三级在线观看| 老牛国产精品一区的观看方式| 欧美色中文字幕| 亚洲国产日韩欧美综合久久 | 一区二区三区视频在线| 在线电影欧美日韩一区二区私密| 亚洲国产婷婷综合在线精品 | 亚洲免费观看在线观看| 亚洲欧美一区二区三区在线| 亚洲精品视频在线播放| 午夜视频久久久久久| 欧美一区二区三区四区夜夜大片| 国产精品久久久久久久久久ktv| 亚洲国产高清在线观看视频|