- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用 pthreads 在获得锁之前必须在任何互斥体上调用 pthread_mutex_init()。
根据 POSIX,锁定未初始化的互斥量仅针对具有优先级保护的互斥量 (opengroup : pthread_mutex_lock)
根据联机帮助页 pthread_mutex_lock.3thr如果在未初始化的互斥锁上调用,它应该返回 EINVAL。假设可移植性不是问题,编写如下代码是否有效(一个好主意?):
pthread_mutex_t lock;
int ret = pthread_mutex_lock(&lock);
if (ret != 0){
if(ret == EINVAL){
pthread_mutex_init(&lock, NULL);
} else {
/* other error */
}
}
还有其他方法可以检查 pthread_mutex 是否已初始化吗?
整个场景是库的一部分(不幸的是政治不是 C++),我想尽量避免错误使用。 IE。客户端可能会初始化创建的对象两次,可能会在正确初始化之前将对象传递给其他函数等。
目前对象中有一个额外的标志,用于标记互斥量是否已初始化,我想知道是否真的有必要。
查看用于静态互斥初始化的宏 PTHREAD_MUTEX_INITIALIZER
的扩展,它只是扩展为一个所有成员都设置为 0 的结构。如果资源本身已被释放(确定是否没有其他人使用它),我是否可以假设如果不再需要它则不需要调用 mutex_destroy?
更新:Jens 的回答绝对正确。以下程序产生完全未定义的行为:
int main(int argc, char** argv)
{
pthread_mutex_t lock;
int ret = pthread_mutex_lock(&lock);
if (ret != 0) {
printf(" ERR : %d %s \n", ret, strerror(ret));
if (ret == EINVAL) {
pthread_mutex_init(&lock, NULL);
}
} else {
printf(" ok \n");
}
pthread_mutex_unlock(&lock);
return 0;
}
有时会死锁,有时会打印正常。 .....
最佳答案
不,你无法检测到。 EINVAL
可能会为未初始化的互斥体返回,但不一定。
此外 POSIX 规定:
Attempting to initialize an already initialized mutex results in undefined behavior.
所以你不应该那样做。
最好的方法是完全避免这种情况并正确初始化变量。这应该通过宏 PTHREAD_MUTEX_INITIALIZER
完成。
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
关于检查 pthread_mutex 是否初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24468470/
我不明白为什么在这段代码中我遇到了死锁。我已经定义了这个互斥体: 互斥锁3:= 0(锁定) 互斥锁2:= 1(解锁) 我有 2 个进程:父亲和儿子。每个线程都有 N 个线程,我通过参数传递这些线程。子
我有以下代码: bool Mutex::timed_lock(unsigned long milliseconds) { if (!milliseconds) { re
问题背景 有问题的代码与 C++ 实现有关。我们有代码库,其中对于某些关键实现,我们使用 asm volatile ("mfence":"memory")。 我对内存障碍的理解是—— 用于确保指令集的
在使用 pthread_mutex_t 之前,应该调用 pthread_mutex_init(),在不再需要它之后,应该使用 pthread_mutex_destroy() 销毁它。 我的问题是,如果
使用 pthreads 在获得锁之前必须在任何互斥体上调用 pthread_mutex_init()。 根据 POSIX,锁定未初始化的互斥量仅针对具有优先级保护的互斥量 (opengroup : p
我目前正在阅读操作系统:三篇简单的文章,我开始了解并发背后的逻辑。在第 26 个“章节”中,我们得到了这个线程示例和围绕原子性的问题: #include #include #include st
我已经搜索了很多小时来寻找解决方案,但找不到简单的答案。我有一个类,它使用 pthreads。实际的函数指针在类中是静态的,我需要锁定互斥体,因为到目前为止我得到了“奇怪”的结果(参数未正确传递)。
我目前正在尝试使用 pthread_mutex 模型在 Linux 中同步两个进程。 这是我正在处理的代码: #include #include #include #include using
我正在尝试在 Linux 中使用基于健壮的 futex 的 pthread 互斥体,因为我需要既快速又健壮(恢复“死”锁)。我如何检查任何 Linux 系统上的 pthread 互斥库是否基于健壮的
我尝试在 pthread_mutex 上创建一个包装器,该包装器维护当前线程持有的所有互斥锁的列表。但是,我也使用了某些库代码,对此我不可能使用这个包装器。有什么办法可以得到这个通用 pthread_
我用 C 和 Java 编写了完全相同的程序,其中两个线程递增全局计数器。为了确保 C 中计数器访问的排他性,使用了 pthread_mutex_t,而在 Java 中则使用 synchronized
在 pthread_mutex_init 等接口(interface)的手册页中, int pthread_mutex_init(pthread_mutex_t *restrict mutex,
根据手册页 pthread_mutex_lock locks the given mutex. If the mutex is currently unlocked, it becomes locke
boost::details::pool::pthread_mutex 和 boost::details::pool::null_mutex 有什么区别。 我看到在最新的 boost 版本 - 1.4
我现在正在学习多线程编程,我注意到使用互斥锁实现同步的程序在 Mac OS X 上非常慢,在某种程度上通常最好使用单线程。我知道有更快的同步方式,但我仍然想知道为什么会这样。为了简单的时间测量,我写了
我是一名优秀的程序员,十分优秀!