多執行緒不安全的posix函式

2021-07-02 20:23:05 字數 2866 閱讀 3766

localtime

localtime返回乙個指向靜態變數的指標,這樣是執行緒不安全的,使用localtime_r代替

stl中的容器類

stl容器只保證執行緒讀安全,不保證執行緒寫安全

strtok

應用函式初次呼叫strtok時傳遞乙個字串的位址,比如」aaa.bbb.dddd」,並將字串的位址儲存在自己的靜態變數中,當你將來再次呼叫strtok並傳遞null時(strtok的特殊用法,第二次呼叫時字串傳null表示對第一次傳進去的字串繼續分隔,所以要先儲存字串位址,這是有點怪異的實現),該函式就會引用儲存好的字串位址。在多執行緒環境下,另乙個執行緒也可能呼叫strtok,在這種環境下,另乙個執行緒會在第乙個執行緒不知道的情況下替換靜態變數中的字串位址,這就會導致各種難以排除的錯誤出現。

asctime()

basename()

catgets()

crypt()

ctermid()//if passed a non-null argument

ctime()

dbm_clearerr()

dbm_close()

dbm_delete()

dbm_error()

dbm_fetch()

dbm_firstkey()

dbm_nextkey()

dbm_open()

dbm_store()

dirname()

dlerror()

drand48()

ecvt()//[posix.1-2001 only (function removed in posix.1-2008)]

encrypt()

endgrent()

endpwent()

endutxent()

fcvt()//[posix.1-2001 only (function removed in posix.1-2008)]

ftw()

gcvt()//[posix.1-2001 only (function removed in posix.1-2008)]

getc_unlocked()

getchar_unlocked()

getdate()

getenv()

genevn的實現原理為:

程序應當維護著乙個全域性變數 char **environ,用來指向每一條環境變數的字串,同時在原本的getenv的實現裡,還應當維護著乙個全域性的字串的緩衝區(暫且命名為envbuf),當執行緒呼叫getenv()時,系統找到對應的環境變數的字串,拷貝到全域性緩衝區envbuf中,再通過getenv()函式返回給呼叫者。

如果多個執行緒同時呼叫getenv()的話,可能就會出現對envbuf的非同步訪問,造成返回錯誤結果

getgrent()

getgrgid()

getgrnam()

gethostbyaddr()//[posix.1-2001 only (function removed in posix.1-2008)]

gethostbyname()//[posix.1-2001 only (function removed in posix.1-2008)]

gethostent()

getlogin()

getnetbyaddr()

getnetbyname()

getnetent()

getopt()

getprotobyname()

getprotobynumber()

getprotoent()

getpwent()

getpwnam()

getpwuid()

getservbyname()

getservbyport()

getservent()

getutxent()

getutxid()

getutxline()

gmtime()

hcreate()

hdestroy()

hsearch()

inet_ntoa()

l64a()

lgamma()

lgammaf()

lgammal()

localeconv()

localtime()

lrand48()

mrand48()

nftw()

nl_langinfo()

ptsname()

putc_unlocked()

putchar_unlocked()

putenv()

pututxline()

rand()

readdir()

setenv()

setgrent()

setkey()

setpwent()

setutxent()

strerror()

strsignal()//[added in posix.1-2008]

system()//[added in posix.1-2008]

system()中會呼叫fork()產生乙個子程序,注意是程序;程式中所有的執行緒好像都被複製。。

這樣,貌似不能在多執行緒環境中使用system()

tmpnam()//if passed a non-null argument

ttyname()

unsetenv()

wcrtomb()//if its final argument is null

wcsrtombs()//if its final argument is null

wcstombs()

wctomb()

結論:沒什麼事別用多執行緒,一不留神,死都不知道怎麼死的..

執行緒不安全

背景 執行緒不安全 sleep 模擬網路延遲 後多執行緒併發訪問同乙個資源 方法1 同步 塊 語法 synchronized 同步鎖 catch interruptedexception e 方法2 同步方法 使用synchronizd修飾的方法,就叫同步方法,保證a執行緒執行該方法的時候,其他執行...

多執行緒之執行緒不安全演示

什麼樣的 會導致執行緒不安全.有時後,子類繼承重寫父類方法後會導致執行緒不安全.package com.ldp.demo01 import lombok.extern.slf4j.slf4j import j a.util.arraylist import j a.util.list author ...

多執行緒 三 執行緒安全與不安全

二 解決執行緒不安全問題 如果多執行緒環境下 執行的結果是符合我們預期的,即在單執行緒環境應該的結果,則說這個程式是執行緒安全的。例 賣票 a 1和a 2不具有原子性,導致 行之間插入了併發 並行執行的其他 b 1 造成的結果 業務邏輯處理出現問題 當客戶端a檢查還有一張票時,將票賣掉,還沒有執行更...