概述
#include#include#include#include#include#include#includeclassCThreadQueue
{public:
CThreadQueue(intqueueSize=1024):
sizeQueue(queueSize),lput(0),lget(0)
{
pthread_mutex_init(&mux,0);get=sem_open("get", O_RDWR|O_CREAT);
put=sem_open("put", O_RDWR|O_CREAT);
sem_init(get,0,0);
sem_init(put,0, sizeQueue);
buffer=newvoid*[sizeQueue];
}virtual~CThreadQueue()
{
sem_unlink("get");
sem_unlink("put");
delete[] buffer;
}void*getq()
{
sem_wait(get);void*data;
pthread_mutex_lock(&mux);/*while(lget==lput&&nData==0)
{
nEmptyThread++;
//pthread_cond_wait(&condGet,&mux);
nEmptyThread--;
}*/data=buffer[lget++];//nData--;if(lget==sizeQueue)
{
lget=0;
}/*if(nFullThread) //必要时才进行signal操作,勿总是signal
{
//pthread_cond_signal(&condPut);
sem_post(put);
}*/pthread_mutex_unlock(&mux);
sem_post(put);returndata;
}voidputq(void*data)
{
sem_wait(put);
pthread_mutex_lock(&mux);/*while(lput==lget&&nData)
{
nFullThread++;
//pthread_cond_wait(&condPut,&mux);
sem_wait(put);
nFullThread--;
}*/buffer[lput++]=data;//nData++;if(lput==sizeQueue)
{
lput=0;
}/*if(nEmptyThread)
{
//pthread_cond_signal(&condGet);
sem_post(get);
}*/pthread_mutex_unlock(&mux);
sem_post(get);
}private:
pthread_mutex_t mux;//pthread_cond_t condGet;//pthread_cond_t condPut;sem_t*get;
sem_t*put;void**buffer;//循环消息队列intsizeQueue;//队列大小intlput;//location put 放数据的指针偏移intlget;//location get 取数据的指针偏移};
CThreadQueue queue;//使用的时候给出稍大的CThreadQueue初始化参数,可以减少进入内核态的操作。void*produce(void*arg)
{inti=0;
pthread_detach(pthread_self());while(i++<100)
{
queue.putq((void*)i);
}
}void*consume(void*arg)
{intdata;while(1)
{
data=(int)(queue.getq());
printf("data=%dn",data);
}
}intmain()
{
pthread_t pid;inti=0;while(i++<3)
pthread_create(&pid,0,produce,0);
i=0;while(i++<3)
pthread_create(&pid,0,consume,0);
sleep(5);return0;
}
最后
以上就是感动斑马为你收集整理的linux 伪线程,Linux下面的线程锁,条件变量以及信号量的使用的全部内容,希望文章能够帮你解决linux 伪线程,Linux下面的线程锁,条件变量以及信号量的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复