【发布时间】:2014-09-03 16:03:14
【问题描述】:
我有一个服务器,它为每个传入的请求生成一个新进程或线程,我需要从线程和进程读取和写入该服务器中定义的变量。由于服务器程序需要同时在 UNIX 和 Windows 上运行,我需要以可移植的方式共享变量,但我该怎么做呢?
我需要使用标准 C 库或原生系统调用,所以请不要推荐第三方库。
【问题讨论】:
我有一个服务器,它为每个传入的请求生成一个新进程或线程,我需要从线程和进程读取和写入该服务器中定义的变量。由于服务器程序需要同时在 UNIX 和 Windows 上运行,我需要以可移植的方式共享变量,但我该怎么做呢?
我需要使用标准 C 库或原生系统调用,所以请不要推荐第三方库。
【问题讨论】:
shared memory 是特定于操作系统的。在 Linux 上,考虑阅读 shm_overview(7) 和(因为使用共享内存,您总是需要某种方式来同步)sem_overview(7)。
当然,您需要找出类似(但可能不等同)的 Windows 函数调用。
注意threads 与processes 不同。根据定义,线程共享一个共同的address space。对于线程,主要问题主要是同步,通常使用mutexes(例如pthread_mutex_lock等...)。在 Linux 上,阅读 pthread tutorial 和 pthreads(7)
回想一下,有几个库(glib、QtCore、Poco、...)在操作系统特定功能之上提供了有用的抽象,但您似乎希望避免使用它们。
最后,我完全不确定像您要求的那样共享变量是实现目标的最佳方式(我肯定会考虑使用event loop 的message passing 方法:pipe(7) 和poll(2) ,也许是 textual protocol à la JSON)。
【讨论】:
CreateFile()、CreateFileMapping()、MapViewOfFile() 等的调用。然而,同步的东西明显不同(信号量和互斥体被创建为全局内核 objs配置安全描述符,而不仅仅是存储在共享内存中)。不错的答案,顺便说一句。