我做了兩個實驗:
第乙個實驗,建立乙個本地檔案,然後用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 此 利用...
程式設計是否是藝術
有的人說程式設計是一種藝術,有的人說程式設計不足以作為藝術,但這兩方似乎從未公開正式的當面辯論過。我只有乙個人,無法公平的分成兩邊來辯論,所以今天不講前人已有的各種理論,只嘗試從道理上分析一下 程式設計是否是藝術。為了分析程式設計是否是藝術,我們首先分析幾種被廣泛認可的藝術形式,尋找它們的共同特徵。...