亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4348 | 回復(fù): 5
打印 上一主題 下一主題

linux下 原子操作\可重入\線程安全 3問 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-03-27 10:49 |只看該作者 |倒序?yàn)g覽
#1  可重入:
在apue第二版 10.6 可重入函數(shù)中,講到malloc函數(shù)是不可重入的
那么我在以下多線程中:

  1. thread1()
  2. {
  3.         malloc(...)
  4.         ...
  5.         free(..)
  6. }
  7. thread2()
  8. {
  9.         malloc(...)
  10.         ...
  11.         free(..)
  12. }
復(fù)制代碼

這樣會(huì)不會(huì)可能導(dǎo)致進(jìn)程崩潰呢?(我一直都是這樣寫的 ,難道我一直都是錯(cuò)的么??)

#2  原子操作:
我想對(duì)一全局量進(jìn)行+ ,-操作,windows下有Interlocked函數(shù)族 ,通過對(duì)內(nèi)存總線加鎖,
來實(shí)現(xiàn)相應(yīng)操作,x86匯編指令貌似是 asm:lock之類的,故此函數(shù)族非常高效,僅需幾個(gè)指令
周期,unix/linux 下有沒有通用的、高效的方法呢?(mutex加鎖太耗費(fèi)料,實(shí)在不想用這個(gè))
我嘗試寫了以下函數(shù):

  1. void atomic_inc(int *p)
  2. {
  3.         volatile static int flag=0;
  4.         while(flag);
  5.         flag = 1;
  6.         *p = *p + 1;
  7.         flag = 0;
  8. }
復(fù)制代碼

gcc -S -O3編譯,查看匯編指令發(fā)現(xiàn)此方法行不通:

  1. .L3:
  2.         movl        flag.1280, %eax
  3.         testl        %eax, %eax
  4.         jne        .L3
  5.         movl        $1, flag.1280
  6.         addl        $1, (%edx)
  7.         popl        %ebp
  8.         movl        $0, flag.1280
  9.         ret

復(fù)制代碼


#3 線程安全:
apue 12.5列出了一坨"不能"保證線程安全的函數(shù),比如rand,ctime ,lcoaltime,
inet_ntoa,gethostbyname等,在windows下,crt線程函數(shù)_beginthread 在調(diào)用系統(tǒng)api
createthread 之前,會(huì)創(chuàng)建一個(gè)結(jié)構(gòu)體_tiddata,來存放這類函數(shù)的靜態(tài)數(shù)據(jù)以及errno等,
大家平時(shí)在unix下多線程編程是如何搞定這些函數(shù)的?還是干脆視而不見呢?

#4 關(guān)于這方面有沒有什么權(quán)威的資料呢,各位推薦下和呵!

[ 本帖最后由 windyrobin 于 2009-3-27 10:51 編輯 ]

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-03-27 11:33 |只看該作者
第一,不可重入跟線程安全是兩個(gè)概念,lz的代碼不會(huì)崩潰
第二,這樣的原子操作可以用自旋鎖實(shí)現(xiàn),其實(shí)win的interlocked族函數(shù)也是用x86的XCHG指令實(shí)現(xiàn)的
第三,加鎖

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-03-27 11:53 |只看該作者
1. 據(jù)說malloc執(zhí)行過程中線程被信號(hào)中斷, 你在信號(hào)處理函數(shù)中又去malloc, 可能會(huì)有問題.
2. 用戶層上不知道有無函數(shù)實(shí)現(xiàn)?
3. errno應(yīng)是對(duì)應(yīng)于線程的, 沒有問題. 其他函數(shù)很多有加 _r版本

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-03-27 12:11 |只看該作者
本版精華有討論 可重入函數(shù)和線程安全函數(shù)的。樓主可以去看一下。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-03-27 13:33 |只看該作者
#3, 自己寫一個(gè)跨平臺(tái)的無靜態(tài)數(shù)據(jù)的版本。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-03-27 14:46 |只看該作者
原帖由 windyrobin 于 2009-3-27 10:49 發(fā)表
#1  可重入:
在apue第二版 10.6 可重入函數(shù)中,講到malloc函數(shù)是不可重入的
那么我在以下多線程中:

thread1()
{
        malloc(...)
        ...
        free(..)
}
thread2()
{
        ma ...

其實(shí)有很強(qiáng)大的malloc實(shí)現(xiàn),完全可重入,異步信號(hào)也是安全的。
不過現(xiàn)在通用的C庫的malloc實(shí)現(xiàn)一般僅僅保證線程安全。

LZ如果有興趣可以去網(wǎng)上搜一些這方面的論文:
"mostly lock free malloc"
"scalable lock-free dynamic memory allocation"。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP