tulip 多執行緒的版本

2021-06-28 01:20:14 字數 1117 閱讀 8540

上次的網路程式設計的例子,改寫成多執行緒的是這樣:

import socket

import thread

def main():

listen_sock = socket.socket(family=socket.af_inet, type=socket.sock_stream, proto=socket.ipproto_ip)

listen_sock.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)

listen_sock.bind(('0.0.0.0', 9090))

listen_sock.listen(0)

while true:

conn_sock, client_addr = listen_sock.accept()

thread.start_new(serve, (conn_sock, client_addr))

def serve(conn_sock, client_addr):

print('connected from %s:%s' % client_addr)

input = conn_sock.recv(8192)

while 'done' != input.strip():

conn_sock.sendall(input)

input = conn_sock.recv(8192)

conn_sock.sendall('bye!\n')

conn_sock.close()

main()

變成多執行緒之後,就可以有多個客戶端同時連線到伺服器並同時進行服務了。最重要的是每個執行緒,對應了乙個「serve」函式的執行。所以函式執行就是有乙個函式的棧,棧上有乙個函式的引數和區域性變數。最重要的乙個區域性變數就是conn_sock,有了這個socket就可以和對應的客戶端進行對話。

機器都有乙個esp的暫存器指向函式的棧頂所在的記憶體位址。乙個cpu核只有乙個esp暫存器。有多個執行緒同時執行的時候,每個執行緒的狀態是由作業系統核心負責儲存在記憶體中的。當這個執行緒被排程為執行狀態的時候,esp暫存器被切換為當前執行緒的棧頂位置,然後繼續執行這個執行緒的後面的指令。伺服器可以支援多個客戶端,就有兩個關鍵的問題要解決:

多執行緒版本的RunTime Library

1 unsigned long beginthreadex void security,相當於security引數 unsigned stack szie,新執行緒的堆疊大小,以位元組為單位 unsigned stdcall start address void 執行緒啟動時所執行的函式。對應的wi...

多執行緒版本的RunTime Library

1 unsigned long beginthreadex void security,相當於security引數 unsigned stack szie,新執行緒的堆疊大小,以位元組為單位 unsigned stdcall start address void 執行緒啟動時所執行的函式。對應的wi...

C Runtime 函式庫的多執行緒版本

本文引用於 深入淺出mfc 當c runtime 函式庫於 1970s 年代產生出來時,pc 的 記憶體容量還很小,多工是個新奇概念,更別提什麼多執行執行緒了。因此以當時產品為基礎所演化的 c runtime 函 數 庫在多執行緒 multithreaded 的表現上有嚴重問題,無法被多執行緒程式使...