#include <stdio.h>
#include <string>
#include <iostream>
#include <pthread.h>
#include <queue>
#include <unistd.h>
pthread_mutex_t mMutex;
pthread_cond_t mCond;
pthread_condattr_t mAttr;
std::queue<std::string> mQueue;
void mutex_init()
{
pthread_condattr_init(&mAttr);
pthread_mutex_init(&mMutex, NULL);
pthread_cond_init(&mCond, &mAttr);
}
// 入队列
void enqueue(std::string str)
{
// 加锁
pthread_mutex_lock(&mMutex);
// 如果队列是空的
if (mQueue.empty())
{
// 入队列
mQueue.push(str);
// 通知消费者
pthread_cond_signal(&mCond);
// 或者使用pthread_cond_broadcast广播
// pthread_cond_broadcast(&mCond);
}
else
{
// 入队列
mQueue.push(str);
}
// 解锁
pthread_mutex_unlock(&mMutex);
}
// 出队列
std::string dequeue()
{
std::string str = "";
// 加锁
pthread_mutex_lock(&mMutex);
if (mQueue.empty())
{
// pthread_cond_wait函数会先释放互斥锁,然后阻塞等待,这样可以防止死锁
pthread_cond_wait(&mCond, &mMutex);
// 或者用pthread_cond_timedwait指定一个阻塞超时时间
// pthread_cond_timedwait(&mCond, &mMutex, &tv);
}
// 出队列
str = mQueue.front();
mQueue.pop();
// 解锁
pthread_mutex_unlock(&mMutex);
return str;
}
// 发送消息线程
void *send_pthread(void *arg)
{
std::string str;
while(1)
{
// 读命令行输入
getline(std::cin, str);
// 入队列
enqueue(str);
}
return NULL;
}
int main()
{
int err = -1;
pthread_t send_tid;
// 清空队列
mQueue = std::queue<std::string> ();
mutex_init();
//创建线程,用于写队列
err = pthread_create(&send_tid, NULL, send_pthread, NULL);
if (err != 0)
{
printf("can't create send_pthread\n");
return -1;
}
while (1)
{
// 接收消息
std::string str = dequeue();
printf("dequeue() = %s\n", str.c_str());
sleep(1);
}
}