- 使用普通的队列代替自旋锁队列,因为在单线程中没有并发问题,且使用自旋锁可能会浪费CPU时间。
- 在生产者线程中使用 usleep 使得线程休眠一段时间,避免无限制地不停地往队列中添加元素,造成队列过度膨胀。
- 在消费者线程中使用 while 循环等待队列中有新的元素,而不是直接退出循环,以保证可以实时处理新加入队列的元素。
- 使用智能指针来管理内存,避免手动释放内存带来的问题。
代码如下:
#include
using namespace std;
template
typedef typename std::queue<T, Container> queue_t;
typedef typename queue_t::value_type value_type;
protected:
queue_t m_queue;
public:
void push(const value_type& value){ m_queue.push(value);}
bool try_pop(value_type& result)
{
if (!m_queue.empty())
{
result = m_queue.front();
m_queue.pop();
return true;
}
else
return false;
}
};
struct ttt {
char a[12];
int b;
};
static terra_queuestd::shared_ptr<ttt> global_queue;
void* workTrheadFunc(void* arg) {
int v=0;
while (true)
{
ttt *val=new ttt;
val->b=v++;
global_queue.push(std::shared_ptr<ttt>(val));
usleep(100); // 休眠一段时间
}
return 0;
}
int main() {
pthread_t log_tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
const size_t stack_size = 10 * 1024 * 1024 * 1024;
pthread_attr_setstacksize(&attr, stack_size);
pthread_create(&log_tid, &attr, workTrheadFunc,NULL);
while (true)
{
std::shared_ptr<ttt> i;
while (!global_queue.try_pop(i)) {} // 等待有元素可以处理
cout << "Consumer: " << i->b << endl;
}
}