pthread_cond_wait() 是否在收到信号后立即获取互斥量?
Does pthread_cond_wait() acquire the mutex immediately after being signalled?
我有一个线程 A,其功能在一个循环中运行,执行某项操作并唤醒另一个线程 B。然后它释放互斥锁并继续下一次迭代。线程 B 等待直到收到信号,然后做一些事情。我的问题是,在循环的下一次迭代中,是否保证 B 将在收到信号后获取互斥锁,或者线程 A 是否可以在 B 之前重新获取互斥锁?
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t signal = PTHREAD_COND_INITIALIZER;
int condition=0;
//function for thread A
void func_A(void *arg){
while(1) {
pthread_mutex_lock(&lock);
do_something();
condition=1;
pthread_cond_signal(&signal);
pthread_mutex_unlock(&lock);
}
}
//function for thread B
void func_B(void *arg) {
while(1) {
pthread_mutex_lock(&lock);
while(condition = 0)
pthread_cond_wait(&signal, &lock);
do_something_else();
condition=0;
pthread_mutex_unlock(&lock);
}
}
有没有办法确保 B 在收到信号后获取互斥量?
Is there a way to make sure B acquires the mutex after it is signalled?
不,没有这样的方式 - B
将像往常一样与其他线程竞争拥有互斥量。
此外,当 A
在发信号时拥有互斥锁时,如何期望 B
在收到信号时自动获取互斥锁?
因此,我通过使用初始化为 1 的信号量克服了这个问题。线程 A 在锁定互斥量 lock
之前对信号量执行 sem_wait()
操作。线程 B 在释放互斥量 lock
.
之前对信号量执行 sem_post()
操作
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t signal = PTHREAD_COND_INITIALIZER;
sem_t my_sem; //properly initialized with value set to 1
int condition=0;
//function for thread A
void func_A(void *arg){
while(1) {
sem_wait(&my_sem); //notice the change
pthread_mutex_lock(&lock);
do_something();
condition=1;
pthread_cond_signal(&signal);
pthread_mutex_unlock(&lock);
}
}
//function for thread B
void func_B(void *arg) {
while(1) {
pthread_mutex_lock(&lock);
while(condition = 0)
pthread_cond_wait(&signal, &lock);
do_something_else();
condition=0;
sem_post(&my_sem); //notice the change
pthread_mutex_unlock(&lock);
}
}
我有一个线程 A,其功能在一个循环中运行,执行某项操作并唤醒另一个线程 B。然后它释放互斥锁并继续下一次迭代。线程 B 等待直到收到信号,然后做一些事情。我的问题是,在循环的下一次迭代中,是否保证 B 将在收到信号后获取互斥锁,或者线程 A 是否可以在 B 之前重新获取互斥锁?
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t signal = PTHREAD_COND_INITIALIZER;
int condition=0;
//function for thread A
void func_A(void *arg){
while(1) {
pthread_mutex_lock(&lock);
do_something();
condition=1;
pthread_cond_signal(&signal);
pthread_mutex_unlock(&lock);
}
}
//function for thread B
void func_B(void *arg) {
while(1) {
pthread_mutex_lock(&lock);
while(condition = 0)
pthread_cond_wait(&signal, &lock);
do_something_else();
condition=0;
pthread_mutex_unlock(&lock);
}
}
有没有办法确保 B 在收到信号后获取互斥量?
Is there a way to make sure B acquires the mutex after it is signalled?
不,没有这样的方式 - B
将像往常一样与其他线程竞争拥有互斥量。
此外,当 A
在发信号时拥有互斥锁时,如何期望 B
在收到信号时自动获取互斥锁?
因此,我通过使用初始化为 1 的信号量克服了这个问题。线程 A 在锁定互斥量 lock
之前对信号量执行 sem_wait()
操作。线程 B 在释放互斥量 lock
.
sem_post()
操作
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t signal = PTHREAD_COND_INITIALIZER;
sem_t my_sem; //properly initialized with value set to 1
int condition=0;
//function for thread A
void func_A(void *arg){
while(1) {
sem_wait(&my_sem); //notice the change
pthread_mutex_lock(&lock);
do_something();
condition=1;
pthread_cond_signal(&signal);
pthread_mutex_unlock(&lock);
}
}
//function for thread B
void func_B(void *arg) {
while(1) {
pthread_mutex_lock(&lock);
while(condition = 0)
pthread_cond_wait(&signal, &lock);
do_something_else();
condition=0;
sem_post(&my_sem); //notice the change
pthread_mutex_unlock(&lock);
}
}