準(zhǔn)則6: 遵守多線程編程的常識(shí) 要準(zhǔn)確把握在POSIX標(biāo)準(zhǔn)的函數(shù)中,那些函數(shù)是非線程安全的,一定不要使用 要讓自己編寫的函數(shù)符合線程安全 在訪問共享數(shù)據(jù)/變量之前一定要先鎖定 如果使用C++的話,一定要注意函數(shù)的同步方法
準(zhǔn)則6: 遵守多線程編程的常識(shí)
說明: (2) 要讓自己編寫的函數(shù)符合線程安全
在寫多線程的應(yīng)用程序時(shí),在多個(gè)線程里共享的變量要先鎖定然后在更新它.。那么在多線程里共享的變量主要有全局變量和函數(shù)內(nèi)的靜態(tài)變量。而且,即使是short型和int型的共享變量也要先鎖定后更新才能保證其安全。
※ 詳細(xì)的是參考 還有,在使用C++編程的場合要注意函數(shù)的方步方法。一般的說來下面的寫法是錯(cuò)誤的。Mutex在函數(shù)內(nèi)被聲明成靜態(tài)變量是不允許的。 int incr_counter(void) { static Mutex m; // 這么寫不行 m.Lock(); static int counter = 0; int ret = ++counter; m.Unlock(); return ret;} 應(yīng)該用下面的方式來代替, Mutex m;int incr_counter(void) { m.Lock(); // ... 把Mutex聲明成全局變量的話比較好(稍微比上一個(gè)好)。 ※ 詳細(xì)是參考 UNIX上C++程序設(shè)計(jì)守則(6)-- 補(bǔ)記 線程安全函數(shù)是像下面那樣 不要操作局部的靜態(tài)變量(函數(shù)內(nèi)的static型的變量)和非局部的靜態(tài)數(shù)據(jù)(全局變量)。并且,其它的非線程安全函數(shù)不要調(diào)用 要操作這樣的變量的話, 就要使用mutex進(jìn)行同步處理,來限制多個(gè)線程同時(shí)對(duì)它進(jìn)行操作 被定義的,但是 特別是前者, 和被叫做可重入的(reentrant)函數(shù)有區(qū)別 反之, 后者特別是和叫做"Serializable"(不單單是MT-Safe)"Safe"的函數(shù)有區(qū)別 也有以上的情況。在Solaris的man手冊(cè)里, 用后者的方式進(jìn)行區(qū)別. 從多線程程序里安全調(diào)用的話,就叫做"Safe", 而且, 在多線程中能夠并發(fā)(concurrency)地執(zhí)行這個(gè)函數(shù)的處理的話,好像就叫做"MT-Safe"。 嗯, 因?yàn)楸容^詳細(xì)的, 如果不是在對(duì)于執(zhí)行速度要求比較苛刻的環(huán)境中編寫代碼的話, 單單地意識(shí)到「是否線程安全」就足夠了,不是嗎。
還有,在使用C++編程的場合要注意函數(shù)的方步方法。一般的說來下面的寫法是錯(cuò)誤的。Mutex在函數(shù)內(nèi)被聲明成靜態(tài)變量是不允許的。
int incr_counter(void) { static Mutex m; // 這么寫不行 m.Lock(); static int counter = 0; int ret = ++counter; m.Unlock(); return ret;}
應(yīng)該用下面的方式來代替,
Mutex m;int incr_counter(void) { m.Lock(); // ...
把Mutex聲明成全局變量的話比較好(稍微比上一個(gè)好)。
※ 詳細(xì)是參考 UNIX上C++程序設(shè)計(jì)守則(6)-- 補(bǔ)記 線程安全函數(shù)是像下面那樣 不要操作局部的靜態(tài)變量(函數(shù)內(nèi)的static型的變量)和非局部的靜態(tài)數(shù)據(jù)(全局變量)。并且,其它的非線程安全函數(shù)不要調(diào)用 要操作這樣的變量的話, 就要使用mutex進(jìn)行同步處理,來限制多個(gè)線程同時(shí)對(duì)它進(jìn)行操作 被定義的,但是 特別是前者, 和被叫做可重入的(reentrant)函數(shù)有區(qū)別 反之, 后者特別是和叫做"Serializable"(不單單是MT-Safe)"Safe"的函數(shù)有區(qū)別 也有以上的情況。在Solaris的man手冊(cè)里, 用后者的方式進(jìn)行區(qū)別. 從多線程程序里安全調(diào)用的話,就叫做"Safe", 而且, 在多線程中能夠并發(fā)(concurrency)地執(zhí)行這個(gè)函數(shù)的處理的話,好像就叫做"MT-Safe"。 嗯, 因?yàn)楸容^詳細(xì)的, 如果不是在對(duì)于執(zhí)行速度要求比較苛刻的環(huán)境中編寫代碼的話, 單單地意識(shí)到「是否線程安全」就足夠了,不是嗎。
UNIX上C++程序設(shè)計(jì)守則(6)-- 補(bǔ)記
線程安全函數(shù)是像下面那樣
被定義的,但是
也有以上的情況。在Solaris的man手冊(cè)里, 用后者的方式進(jìn)行區(qū)別. 從多線程程序里安全調(diào)用的話,就叫做"Safe", 而且, 在多線程中能夠并發(fā)(concurrency)地執(zhí)行這個(gè)函數(shù)的處理的話,好像就叫做"MT-Safe"。
嗯, 因?yàn)楸容^詳細(xì)的, 如果不是在對(duì)于執(zhí)行速度要求比較苛刻的環(huán)境中編寫代碼的話, 單單地意識(shí)到「是否線程安全」就足夠了,不是嗎。
Powered by: C++博客 Copyright © lymons