gpt4 book ai didi

c - 信号量的有效使用?

转载 作者:行者123 更新时间:2023-11-30 19:22:20 25 4
gpt4 key购买 nike

我编写了这个小程序,它使用信号量而不是 pthread_cond 和 pthread_mutex:

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

sem_t sema;

pthread_t threads[2];

pthread_cond_t cond;

pthread_mutex_t mutex;

int value;

void * worker_a();
void * worker_b();

int main() {
value = 3;

sem_init(&sema, 0, 0);

pthread_create(&threads[1], NULL, worker_b, NULL);
pthread_create(&threads[0], NULL, worker_a, NULL);

pthread_join(threads[0], NULL);
pthread_join(threads[1], NULL);

pthread_detach(threads[0]);
pthread_detach(threads[1]);

sem_destroy(&sema);

printf("Value has been set to: %d.\n", value);

return 0;
}

/**
* Multiplicates value by 4.
*/
void * worker_a() {
value *= 4;

sem_post(&sema);

pthread_exit(NULL);
}

/**
* Divides value by 2.
*/
void * worker_b() {
sem_wait(&sema);

value /= 2;

sem_post(&sema);

pthread_exit(NULL);
}

首先这个例子正确吗?我的意思是它可以正确编译和执行,但这也许只是因为程序过于简单。

第二:我是否正确理解使用信号量只是使用互斥锁、条件变量和大量条件标志的更智能的替代方案?

博多

最佳答案

不,鉴于您在评论中阐明的目标(value 最终为 6),这是不正确的。不保证 worker_aworker_b 的执行顺序。

使用信号量与使用普通互斥体没有什么不同。它仅保护免受并发操作的影响,但强制执行任何排序。在 worker_a 获取信号量之前,将 sleep(5) 放入它,您就会明白我的意思。

您可以将信号量初始化为,并在完成后让worker_a发布它。然后 worker_b 将在正确的时间唤醒来完成其工作:

// main
// ----
sem_init(&sema, 0, 0); // N.B. initial value is ZERO

// worker_a
// --------
value *= 4; // We know a priori that sema is zero and others will wait for it
sem_post(&sema); // Let worker_b proceed

// worker_b
// --------
sem_wait(&sema); // Pause until worker_a is done
value /= 2;
sem_post(&sema);

关于c - 信号量的有效使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16838829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com