2015-09-01 111 views
3

是否可以在Linux上用C++创建系统范围的全局变量/信号/互斥锁?C++/Linux中的系统范围全局变量/信号量/互斥量?

原因如下:我有一个系统,经常在不相关的数据上运行同一软件的多个副本。通常有4个工作,每个工作都运行相同的软件。该软件有一个小部分,它创建一个占用大量内存的巨大图形;该部分之外的内存使用量适中。

有时候会发生这样的情况:2个作业同时碰到相同的内存耗尽部分,整个系统开始交换。因此,我们希望通过在不同作业之间创建诸如临界区互斥之类的东西来防止这种情况发生,因此一次只能分配大量内存。

如果这些是同一作业的线程,pthread锁可以完成这项工作。

什么是在不同的工作之间实现这种互斥的好方法?

回答

5

如果您可以让所有进程达成共同名称,则可以使用named semaphore

命名信号量由所述形式 /somename的名称来标识;即由最初 斜线组成的NAME_MAX-4(即251)字符组成的最高为 的以NULL结尾的字符串,后跟一个或多个字符,其中没有一个是 斜线。 通过将相同的名称传递给sem_open(3),两个进程可以在同一个命名的 信号灯上运行。

0

互斥锁(互斥)防止多个线程 从同时执行的代码的关键部分在于 访问共享数据(即,互斥被用来序列 线程的执行)。所有互斥量都必须是全局互斥的。 A 通过mutex_lock() 成功调用互斥锁将导致另一个线程同时试图锁定同一互斥锁,直到所有者线程通过mutex_unlock()的方式解锁为 。其他进程中的同一进程或 中的线程可以共享互斥。

互斥可以在其它过程同步相同过程或 内螺纹。如果互斥量分配在 可写内存中并且在协作进程 (参见mmap(2))中共享并且已经为此任务初始化,则可以使用互斥锁来同步进程间的线程数 。

对于进程间同步,互斥量需要在这些进程之间共享的内存中调用。由于这种互斥体的内存必须动态分配,所以需要使用mutex_init()显式初始化互斥体。对于进程间同步,除了需要在共享内存中分配的要求外,互斥锁还必须使用PTHREAD_PROCESS_SHARED属性,否则从其他进程访问互斥量比创建者导致未定义行为(请参阅:linux.die。net/man/3/pthread_mutexattr_setpshared):“process-shared属性设置为PTHREAD_PROCESS_SHARED,以允许任何有权访问分配互斥量的内存的线程操作互斥量,即使互斥量分配在内存中由多个进程

+1

geez,为什么不提你的源码,而y你在吗? http://docs.oracle.com/cd/E19455-01/806-0630/6j9vkb8e2/index.html –

2

进程间互斥的共享,你可以使用文件锁定。有了Linux,它的代码保护临界区一起flock打电话一样简单。

int fd_lock = open(LOCK_FILE, O_CREAT); 

flock(fd_lock, LOCK_EX); 

// do stuff 

flock(fd_lock, LOCK_UN); 

如果您需要POSIX兼容性,你可以使用fcntl