UNIX網絡編程——客戶/服務器程序設計示範(四)

    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

相關文章
相關標籤/搜索