您的位置:程序门 -> vc/mfc -> 进程/线程/dll



用临界或互斥量 怎样实现生产消费模型啊??


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


用临界或互斥量 怎样实现生产消费模型啊??
发表于:2008-02-01 13:00:04 楼主
用临界或互斥量   怎样实现生产消费模型啊??
困惑    
我在主线程创建互斥量,我看互斥量好像不能控制主线程的执行阿   ?
我的意思是当我执行子线程的代码暂停主线程的执行   怎么做???
发表于:2008-02-01 13:11:521楼 得分:0
临界区m_csnumlock为类的静态变量:

entercriticalsection(&cbasethread::m_csnumlock);
//增加处理代码
//...
leavecriticalsection(&cbasethread::m_csnumlock);
发表于:2008-02-01 15:26:172楼 得分:0
用事件机制createevent,设置成自动,非信号状态.当创建子线程之后,立刻使用waitforsingleobject让主线程等待.当子线程的一次循环结束时,使用setevent方法设置事件为信号态的,然后主线程的waitforsingleobject会返回,于是主线程继续执行.
发表于:2008-02-01 18:28:553楼 得分:0
用事件机制   我知道怎么做     但用互斥怎么做   我就不知道了  
发表于:2008-02-01 18:34:564楼 得分:0
需要2个event,   一个控制producer,   另一个控制consumer

producer向缓冲区放的时候,   要先查缓冲区是否满,   如果满,   则被挂起;   如果空,   则放,   然后用一个事件通知consumer;
consumer从缓冲区取的时候,   要先查缓冲区是否空,   如果空,   则被挂起;   如果满,   则取,   然后用另一事件通知producer.
发表于:2008-02-01 18:35:265楼 得分:0
mutex道理类似
发表于:2008-02-02 10:53:016楼 得分:0
用信号量semaphore,正好和消费者与生产者模型一致.
那个临界区不方便实现,因为它只能保证只有一个线程可以执行
entercriticalsection(&cbasethread::m_csnumlock);  
//增加处理代码  
//...  
leavecriticalsection(&cbasethread::m_csnumlock);
中的代码段.而主线程不一定执行这段代码.

一个信号量,可以允许多个线程在使用同一个信号量的时,都处于运行状态.只有当信号量不存在信号时,新开的线程才会挂起.信号量可以发出信号的数量代表还可以开启多少个线程.
发表于:2008-02-02 13:57:357楼 得分:0
这样这两个线程在同一时刻内只能有一个线程访问到资源
c/c++ code
handle hthreadevent; int workthread(lpvoid lpparam) { resetevent(hthreadevent); //告诉主线程,y等我干完了再继续运行 //do something setevent(hthreadevent); //告诉主线程,本线程好了,你y继续吧 } int main(int argc, char* argv[]) { hthreadevent = createevent( null, // default security attributes true, // manual-reset event true, // initial state is signaled null // object name ); whiletrue) { waitforsingleobject(hthreadevent,infinite); //询问线程,我需要等你不? // //do something printf("线程没有事件发送过来,恩,我继续走下去"); // } return 0; }
发表于:2008-02-06 10:30:078楼 得分:0
semaphore,   mutex,   event都行
critical   section也行
什么都行
发表于:2008-02-27 17:13:459楼 得分:0
路过~~学习


快速检索

最新资讯
热门点击