【发布时间】:2013-03-22 23:56:39
【问题描述】:
所以我的入队和出队函数如下。如何获取我拥有的东西并使其线程安全?我曾考虑使用 Windows.h 中的互斥锁,但如果可能的话,我不希望我的程序仅限于 Windows。
void Queue::Enqueue(int num){
//increase recorded size
size++;
//stick in num
numbers[nextSpace] = num;
//find the next available space
nextSpace = (++nextSpace) % maxSize;
}
int Queue::Dequeue(){
int temp;
temp = items[curSpace];
curSpace = (++curSpace) % maxSize;
size--;
return temp;
}
【问题讨论】:
-
为什么要重新发明轮子?使用 Boost 的
lockfree::queue或类似的东西。 (或者spsc_queue,如果你想为一个消费者和一个生产者提供一个循环缓冲区。) -
Boost 有一个用于同步的可移植库。见boost.org/doc/libs/1_53_0/doc/html/thread/synchronization.html
-
您需要什么版本的“线程安全”? STL 是线程安全的,你知道吗?
-
谷歌搜索“无锁队列”
-
您的 Dequeue() 操作不会测试空队列。您需要测试空队列并返回错误值,或者阻止等待其他人执行下一个 Enqueue()。如果您可以返回错误值(然后通过重复旋转浪费 CPU)查看 boost 的无锁队列。如果您想要阻塞出队操作,请参阅this stack overflow question 和 this web site。
标签: c++ multithreading queue