二进制信号量和互斥量之间是否存在差异,或它们基本相同?
我听说过这些与并发编程有关的词,但它们之间的区别是什么?
我有多个使用g ++编译的应用程序,在Ubuntu中运行.我正在使用命名信号量来协调不同的进程.
一切正常,除非在以下情况下:如果其中一个进程调用sem_wait()或sem_timedwait()减少信号量然后在它有机会调用之前崩溃或被杀死-9 sem_post(),那么从那一刻起,命名信号量就"无法使用".
通过"不可用",我的意思是信号量计数现在为零,并且应该将其增加回1的过程已经死亡或被杀死.
我找不到一个sem_*()API,可能会告诉我上次减少崩溃的过程.
我在某个地方错过了API吗?
以下是我打开命名信号量的方法:
sem_t *sem = sem_open( "/testing",
O_CREAT | // create the semaphore if it does not already exist
O_CLOEXEC , // close on execute
S_IRWXU | // permissions: user
S_IRWXG | // permissions: group
S_IRWXO , // permissions: other
1 ); // initial value of the semaphore
Run Code Online (Sandbox Code Playgroud)
这是我如何减少它:
struct timespec timeout = { 0, 0 };
clock_gettime( CLOCK_REALTIME, &timeout );
timeout.tv_sec += 5;
if …Run Code Online (Sandbox Code Playgroud) 函数pthread_mutex_init允许您指定指向属性的指针.但我还没有找到pthread属性的详细解释.我总是提供NULL.这个论点有用吗?
文档,对于那些忘记它的人:
PTHREAD_MUTEX_INIT(3)BSD库函数手册
PTHREAD_MUTEX_INIT(3)名称pthread_mutex_init - 创建互斥锁
概要
Run Code Online (Sandbox Code Playgroud)#include <pthread.h> int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);说明pthread_mutex_init()函数创建一个新的互斥锁,其属性由attr指定.如果attr为NULL,则使用默认属性.
我之前从未有机会使用pthreads库,但我正在审查一些涉及pthread互斥体的代码.我检查了文档pthread_mutex_lock和pthread_mutex_init,和我从阅读的手册页这两种功能的理解是,我得叫pthread_mutex_init我打电话之前pthread_mutex_lock.
但是,我问了几个同事,他们认为在打电话pthread_mutex_lock之前打电话是可以的pthread_mutex_init.我正在审查的代码也pthread_mutex_lock没有打电话pthread_mutex_init.
基本上,在打电话pthread_mutex_lock之前打电话pthread_mutex_init是否安全和聪明(如果pthread_mutex_init被调用的话)?
编辑:我还看到一些示例,其中未使用pthread_mutex_lock时调用pthread_mutex_init,例如此示例
编辑#2:这是我正在审查的代码.请注意,configure函数获取并附加到某些未初始化的共享内存.稍后将使用Java代码调用lock(),而不会在其间调用其他本机函数.链接到代码
我正在尝试使用 POSIX 命名信号量进行跨进程同步。我注意到进程死亡或退出后,信号量仍然被系统打开。
在进程(打开它)死亡或退出后是否有办法使其关闭/释放?
到目前为止,我在线阅读的几乎所有代码和教程都涉及使用互斥锁和信号量来实现线程之间的同步.它们可以用于在进程之间进行同步吗?
我想编写看起来像这样的代码:
void compute_and_print() {
// acquire mutex
// critical section
// release mutex
}
void main() {
int pid = fork();
if ( pid == 0 ) {
// do something
compute_and_print();
}
else {
// do something
compute_and_print();
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个应用程序,其中实现了 boostnamed_mutex 来锁定 C++ 项目(Visual Studio)中的多个模块。我需要不惜一切代价删除所有增强依赖项。
我还有其他方法可以实现吗?顺便说一句,如果可能的话,我正在使用 C++11
我想使用一个互斥锁,它将用于同步访问驻留在内存中的一些变量,这两个变量共享两个不同的进程.我怎样才能做到这一点.要执行的代码示例将非常感激.