如何解决没有锁和原子的生产者消费者问题是否可能?
我想出了一个似乎适用于单一生产者 - 单一消费者问题的代码。我没有使用任何锁或原子。有什么我遗漏的吗?
const int LEN = 10;
int q[LEN];
volatile int loc1 = 0;
volatile int loc2 = 0;
void* consumer(void* arg) {
while(1) {
while(loc1 == loc2);
int val = q[loc1];
loc1 = (loc1 + 1) % LEN;
}
pthread_exit(NULL);
}
void* producer(void* arg) {
while(1) {
while((loc2 + 1) % LEN == loc1);
q[loc2] = getItem();
loc2 = (loc2 + 1) % LEN;
}
pthread_exit(NULL);
}
我进行了一些压力测试,但这并没有失败。
producer 中的 while 循环在生成新元素之前等待队列中的元素少于 LEN - 1。我基本上防止队列完全填满。
解决方法
以下是一篇关于没有锁但使用原子的单生产者单消费者实现的正式证明的文章: https://blog.adacore.com/from-rust-to-spark-formally-proven-bip-buffers
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。