代码里 只有2个线程(不算主线程在内)在运行
writer, reader内部是 用了for循环,循环次数各自是100,这是100个消费者,100个生产者呢 还是1个生产者,1个消费者???概念很混乱。const int BUF_SIZE = 10;
const int ITERS = 100; boost::mutex io_mutex; class buffer
{
public:
typedef boost::mutex::scoped_lock scoped_lock;
buffer()
: p(0), c(0), full(0)
{
}
void put(int m)
{
scoped_lock lock(mutex);
if (full == BUF_SIZE)
{
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout <<
"Buffer is full. Waiting..."
<< std::endl;
}
while (full == BUF_SIZE)
cond.wait(lock);
}
buf[p] = m;
p = (p+1) % BUF_SIZE;
++full;
cond.notify_one();
} int get()
{
scoped_lock lk(mutex);
if (full == 0)
{
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout <<
"Buffer is empty. Waiting..."
<< std::endl;
}
while (full == 0)
cond.wait(lk);
}
int i = buf[c];
c = (c+1) % BUF_SIZE;
--full;
cond.notify_one();
return i;
}
private:
boost::mutex mutex;
boost::condition cond;
unsigned int p, c, full;
int buf[BUF_SIZE];
}; buffer buf; void writer()
{
for (int n = 0; n < ITERS; ++n) //100次
{
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << "sending: "
<< n << std::endl;
}
buf.put(n);
}
} void reader()
{
for (int x = 0; x < ITERS; ++x) //100次
{
int n = buf.get();
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << "received: "
<< n << std::endl;
}
}
}
int main(int argc, char* argv[])
{
boost::thread thrd1(&reader);
boost::thread thrd2(&writer);
thrd1.join();
thrd2.join();
return 0;
}
解决方案 »
- 想实现个功能不知怎么办???
- activemovie控件做的播放器在选择文件后出现Debug Assertion Failed!!
- 查看进程运行时依赖的dll?
- 摄像头拍照黑,如何解决?
- 如何将cdcel方式的lib文件转成fastcall方式的lib文件?找不到lib文件的源代码了。。
- 我认识的Microsoft新工具:Visual Studio 2005
- 请推荐几个VC反编译工具
- 关于OpenGL版本更新的问题,急
- 使用ODBC连接数据库,使用CRecordset类需要什么样的头文件?
- ListCtrl中怎样才能让鼠标选定的一行都亮?
- CDHtmlDiaglog的IE内核版本问题
- 急!网络套接字的send() recv()等函数能否在APP类中使用或响应
boost::thread r_threa[100];for(i=0; i<100 ;i ++)
{w_thread[i].函数(write);
r_thread[i].函数(read);}会怎样???