TCP預先派生子進程服務器程序,accept使用線程上鎖保護服務器
咱們使用線程上鎖保護accept,由於這種方法不只適用於同一進程內各線程之間的上鎖,並且適用於不一樣進程之間的上鎖。
爲了使用線程上鎖,咱們的main、child_make和child_main函數都保持不變,惟一須要改動的是那3個上鎖函數。在不一樣進程之間使用線程上鎖要求:函數
(注:這要求線程庫支持PTHREAD_RPOCESS_SHARED屬性。)spa
#include "unpthread.h" #include <sys/mman.h> static pthread_mutex_t *mptr; /* actual mutex will be in shared memory */ void my_lock_init(char *pathname) { int fd; pthread_mutexattr_t mattr; fd = Open("/dev/zero", O_RDWR, 0); mptr = Mmap(0, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); Close(fd); Pthread_mutexattr_init(&mattr); Pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED); Pthread_mutex_init(mptr, &mattr); } void my_lock_wait() { Pthread_mutex_lock(mptr); } void my_lock_release() { Pthread_mutex_unlock(mptr); }
12-16 打開/dev/zero而後調用mmap。所映射的字節數是一個pthread_mutex_t類型變量的大小。隨着關閉描述符;這麼作事可行的,由於該描述符已被內存映射了。線程
18-20 咱們使用PTHREAD_PROCESS_SHARED初始化全局或靜態互斥鎖變量。然而對於一個存放在共享內存區中的互斥鎖,咱們調用一些Pthread庫函數以告知該函數庫:這是一個位於共享內存區中的互斥鎖,將用於不一樣進程之間的上鎖。咱們首先爲一個互斥鎖以默認屬性初始化一個pthread_mutexattr_t結構,而後賦予該結構PTHREAD_PROCESS_SHARED屬性(該屬性的默認值爲PTHREAD_PROCESS_PRIVATE,即只容許在單個進程內使用)。最後調用pthread_mutex_init函數以這些屬性初始化共享內存區中的互斥鎖。code