- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 C 中的并发性。我知道有几种方法可以初始化 pthread_mutex_t。
这个简单的程序运行良好:
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void* worker(void* arg) {
pthread_mutex_lock(&lock);
printf("worker says hi\n");
pthread_mutex_unlock(&lock);
return NULL;
}
int main(int argc, char *argv[]) {
pthread_t p;
pthread_create(&p, NULL, worker, NULL);
pthread_mutex_lock(&lock);
printf("master says hi\n");
pthread_mutex_unlock(&lock);
pthread_join(p, NULL);
return 0;
}
但是,如果我不想全局定义锁,我想我可以在我的主线程中定义它并将它传递给另一个线程,如下所示:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* worker(void* arg) {
pthread_mutex_t lock = * (pthread_mutex_t *) arg;
pthread_mutex_lock(&lock);
printf("worker says hi\n");
pthread_mutex_unlock(&lock);
return NULL;
}
int main(int argc, char *argv[]) {
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_t p;
pthread_create(&p, NULL, worker, &lock);
pthread_mutex_lock(&lock);
printf("master says hi\n");
pthread_mutex_unlock(&lock);
pthread_join(p, NULL);
return 0;
}
但是,这不有效。相反,它只打印 master says hi
并挂起。
我认为这可能是死锁,所以我在master中插入了一些 sleep 时间如下:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* worker(void* arg) {
pthread_mutex_t lock = * (pthread_mutex_t *) arg;
pthread_mutex_lock(&lock);
printf("worker says hi\n");
pthread_mutex_unlock(&lock);
return NULL;
}
int main(int argc, char *argv[]) {
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_t p;
pthread_create(&p, NULL, worker, &lock);
sleep(1);
pthread_mutex_lock(&lock);
printf("master says hi\n");
pthread_mutex_unlock(&lock);
pthread_join(p, NULL);
return 0;
}
正如预期的那样,这会打印出 worker says hi
,然后在一秒后打印出 master says hi
。
但是,如果我将 sleep 移动到 worker 中,如下所示,它会再次挂起:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* worker(void* arg) {
pthread_mutex_t lock = * (pthread_mutex_t *) arg;
sleep(1);
pthread_mutex_lock(&lock);
printf("worker says hi\n");
pthread_mutex_unlock(&lock);
return NULL;
}
int main(int argc, char *argv[]) {
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_t p;
pthread_create(&p, NULL, worker, &lock);
pthread_mutex_lock(&lock);
printf("master says hi\n");
pthread_mutex_unlock(&lock);
pthread_join(p, NULL);
return 0;
}
如果我将 sleep 函数放在上方 pthread_mutex_t lock = * (pthread_mutex_t *) arg;
行,那么它不会挂起。我不确定如何解释这种行为。
最佳答案
worker
函数正在复制互斥锁,而它应该只使用现有的互斥锁。修复方法是将 lock
变量声明为指向互斥量的指针:
void* worker(void* arg) {
pthread_mutex_t *lock = arg;
pthread_mutex_lock(lock);
printf("worker says hi\n");
pthread_mutex_unlock(lock);
return NULL;
}
关于c - 使用传递给线程的 pthread_mutex_t 锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50827719/
我在老虎上使用 xcode 2.4.1。当我在下面做的时候一切正常。当我做 pthread_mutex_t mute; ImageMan() { dibSize=0; mute =
发件人:https://www.sourceware.org/pthreads-win32/manual/pthread_mutex_init.html Variables of type pthre
我有一个全局结构指针,我已经完成了一个 malloc (10 个结构的数组),并且我已将该结构的一个实例发送给每个线程,并且在将此结构实例作为参数传递给 pthread_create() 之前,正在更
我是并行计算的新手,所以我正在研究 pthread 和互斥量。运行以下代码会导致死锁。谁能解释我为什么,以及如何以正确的方式做到这一点?我的目的是保护成员变量不被交叉写入。非常感谢! #include
与this question相关--- 我正在调试一些两次解锁互斥锁的代码,我试图弄清楚它发生的确切时间。我从 Helgrind 获取堆栈跟踪,但我希望程序在执行错误解锁时立即崩溃。 我知道解锁一个已
有人可以解释一下在什么情况下使用 std::mutex 与 pthread_mutex_t 比较有益。我不明白为什么我们会使用 pthread_mutex_t。谢谢 最佳答案 pthread_mute
我已经声明了 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 在我的主程序 main.cpp 的全局空间中。 但是,每当我尝试在函数定义中引用它时,例
我想构建一个动态分配的 pthread_mutex 数组,它会随着时间的推移而增长(添加更多的互斥锁)。我的问题是,如果数组被 realloc() 移动,它们是否仍然有效。我担心的是 pthread_
我正在学习 C 中的并发性。我知道有几种方法可以初始化 pthread_mutex_t。 这个简单的程序运行良好: #include #include pthread_mutex_t lock =
在 java 中,我们通常将锁变量设为最终静态,这样它就只有一个副本存在(虽然我记得读过,即使是静态变量也可以复制到两个方法的调用堆栈中!) 但是我在处理C和数据的同步。我已经声明了一个 pthrea
可以将 pthread 锁传递给函数吗?我要求这个的原因是因为我有很多线程,比如说10个,充当消费者,还有2个生产者,每个消费者线程都有它自己的链表(缓冲区),生产者将数据发送到其中之一线程基于特定规
这个问题在这里已经有了答案: Undefined reference to static class member (9 个回答) C++ - Initialize and modify a sta
考虑下一段代码—— #include using namespace std; int sharedIndex = 10; pthread_mutex_t mutex; void* foo(void
问题:初始化的 pthread_mutex_t 对象是否内核持久化?-- 关注的是 Linux V 2.6 以后的版本。 动机:如果持久化:对象资源将不会随着特定的清理而释放,pthread_mute
我为打算在两个进程之间使用的 pthread_mutex_t 编写了一个 super 简单的包装器: //basic version just to test using it between two
我很确定这是一个天真的问题,但仍然会问这个问题,因为我在网上找不到太多帮助。我正在使用 pthreads 编写 C++ 代码。以下是其中一种方法的概述 void Method1() { try
我正在查看 pthreadtypes.h 文件中的 pthread_mutex_t 结构。 “__lock”代表什么?它就像分配给互斥锁的锁号吗? typedef union { struct _
确保堆栈分配的 pthread_mutex_t 对象在多线程环境中仅初始化一次的可取/标准方法是什么? pthread_mutex_init() 手册页说: Attempting to initial
在我的程序中,我有一个守护线程等待任务并将它们打印到文件中。它的作用是: void * deamon(void *) { while(true) { pthread_mutex
我测试了两个非常简单的在多线程代码中打印偶数/奇数的示例,一个使用 pthread_cond_t 而另一个不使用。 void *even(void *arg) { while(count h
我是一名优秀的程序员,十分优秀!