#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;
pthread_mutex_t m_mutex;
public:
terra_spin_queue()
{
pthread_mutex_init(&m_mutex, NULL);
}
~terra_spin_queue()
{
pthread_mutex_destroy(&m_mutex);
}
void push(const value_type& value)
{
pthread_mutex_lock(&m_mutex);
m_queue.push(value);
pthread_mutex_unlock(&m_mutex);
}
bool try_pop(value_type& result)
{
pthread_mutex_lock(&m_mutex);
if (!m_queue.empty())
{
result = m_queue.front();
m_queue.pop();
pthread_mutex_unlock(&m_mutex);
return true;
}
else
{
pthread_mutex_unlock(&m_mutex);
return false;
}
}
};
struct ttt {
char a[12];
int b;
};
static terra_spin_queue
void* workTrheadFunc(void* arg) {
int v=0;
while (true)
{
ttt *val=new ttt;
val->b=v++;
global_queue.push(val);
// usleep(1);
}
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)
{
ttt *i;
if(global_queue.try_pop(i))
{
cout << "Consumer: " << i->b << endl;
delete i;
i=nullptr;
}
}
return 0;
}




