linux write 函式 是否是 執行緒安全的?

2021-08-14 20:59:09 字數 1840 閱讀 2315

我做了兩個實驗:

第乙個實驗,建立乙個本地檔案,然後用5個執行緒對這個檔案進行寫入,結果前面的寫入內容被後面的寫入內容覆蓋;對write函式加鎖之後結果就正常了,就似乎驗證了write函式是非執行緒安全的。

第二個實驗,建立乙個客戶端的tcp socket,然後用5個執行緒對這個socket進行寫入;伺服器端把內容讀取出來並列印,發現列印結果與客戶端傳送內容一致,沒有出現異常,似乎說明write tcp socket是執行緒安全的。

我的問題是:

如果write不是執行緒安全的,為什麼寫tcp socket卻正常,是否因為系統為socket操作加鎖了?

實驗**如下

#include       

#include       

#include       

#include       

#include       

#include       

#include       

#include       

#include       

#include       

#include       

#include       

#include       

#define buff_size 1024

pthread_mutex_t mutex = pthread_mutex_initializer;

struct threadarg

;void* 

proc(void* arg)

}int 

open_socket(char* ip)

int 

open_file(char* file_name)

int 

main(int argc, char** argv)

for (i = 0; i < 5; ++ i)

pthread_join(tids[i], null);

close(fd);

exit(0);}

複製**

實驗二 需要的伺服器程式**如下:

#include       

#include       

#include       

#include       

#include       

#include       

#include       

#include       

#include       

const int max_events = 1024;

const int buff_size = 1024;

void err_quit(const char* msg)

void err_sys(const char* msg)

int create_and_bind(int port_no)

int communicate(const int fd)

printf("msg number = %d\n", count);

if (n_read < 0)

return -1;

return 0;

}int main(int argc, char** argv)

close(listen_fd);

exit(0);}

系統呼叫都是執行緒安全的。 write是原子的, 系統一定要保證這個語義, 不然這系統沒法用了,但是下面這三個都不是執行緒安全的。

printf()----stdout()

malloc-------記憶體分配表

free()--------記憶體分配表

判斷是否是閏年

使用者輸入月份,判斷當前月份為幾月,並輸出有多少天。如果使用者輸入2月份,則請使用者輸入年份,判斷平年則輸出28天,閏年則輸出29天。能被4整除但不能被100整除,或者能被400整除 months input 請輸入當前月份 while notmonths.isdigit or int months...

判斷是否是素數

第一次嘗試 define crt secure no warnings include include intisprimenum int num for int i 2 i num i return1 int main else for int i 100 i 200 i return0 此 利用...

程式設計是否是藝術

有的人說程式設計是一種藝術,有的人說程式設計不足以作為藝術,但這兩方似乎從未公開正式的當面辯論過。我只有乙個人,無法公平的分成兩邊來辯論,所以今天不講前人已有的各種理論,只嘗試從道理上分析一下 程式設計是否是藝術。為了分析程式設計是否是藝術,我們首先分析幾種被廣泛認可的藝術形式,尋找它們的共同特徵。...