CreateSemaphore使用 semaphore使用
2008.11.10 2:00
写了2小时,自己太水了,对那个东西一点都不知道,汗。。。
要看书啊!!
只看MSDN还是不行啊
2008.11.10 12:00
其实就是自己在初始化变量的时候初始化错了,我初始化为0,弄的所有的线程都进入不了临界区。。
cMutex = 1;
//创建一个最多为1的信号量,其实就是一个互斥信号量
mutex =CreateSemaphore(NULL,cMutex,cMutex,NULL);
if (mutex ==NULL)
{
printf("CreateSemaphore error: %dnn",GetLastError());
}
LONG cMax =100;
//创建一个最多100的信号量,代表最多可支持的线程数是100个
write =CreateSemaphore( NULL, 1 ,cMutex,NULL);
只有最初的初始化为1,才可以执行一次down操作让一个线程进去
down和up实际代码如下
void down(HANDLE hHandle)
{
while(WaitForSingleObject(hHandle,INFINITE) !=WAIT_OBJECT_0);
}
void up(HANDLE hHandle)
{
ReleaseSemaphore(hHandle,1,NULL);
}
读者和写者代码如下:
//Reader线程
void ReaderThread(void *p)
{
int ThreadId= ((ThreadInfo*)p)->serial;
int delay =((ThreadInfo*)p)->delay;
int persist= ((ThreadInfo*)p)->persist;
Sleep(delay*100);
printf("Id :%d, Reader sends requestn",ThreadId);
down(mutex);
readCount++;
if(readCount== 1)
down(write);
up(mutex);
printf("Id :%d, Reader begin to executen",ThreadId);
Sleep(persist*100);
down(mutex);
readCount--;
if(readCount== 0)
up(write);
up(mutex);
printf("Id :%d, Reader ends executen",ThreadId);
}
//Writer线程
void WriterThread(void *p)
{
int ThreadId= ((ThreadInfo*)p)->serial;
int delay =((ThreadInfo*)p)->delay;
int persist= ((ThreadInfo*)p)->persist;
Sleep(delay*100);
printf("Id :%d, Writer sends requestn",ThreadId);
down(write);
printf("Id :%d, Writer begin to executen",ThreadId);
Sleep(persist*100);
up(write);
printf("Id :%d, Writer ends executen",ThreadId);
}
更多阅读
CreateSemaphore使用 semaphore使用
本文cztchoice/blog/item/b9b478fafc5a628e9f514635.html2008.11.10 2:00写了2小时,自己太水了,对那个东西一点都不知道,汗。。。要看书啊!!只看MSDN还是不行啊2008.11.10 12:00其实就是自己在初始化变量的时候初始化错了,我初始化为0,弄的所
工行的手机银行怎么使用 如何使用工行手机银行
以下列出的是工行的手机银行所提供的服务:【查询】可查询利率、汇率、债券账户余额及最近的历史账务情况。(1)查询账户:发送内容为“CXZH#卡号/账号”的短信,可查询本人银行账户的余额和当日明细。(2)查询历史明细:发送内容为“CXLS#卡号/账
劳动防护用品的认识与使用 正确使用劳动防护用品
劳动防护用品是安全生产工作的一个重要组成部分。当一些危险、危害因素达不到国家标准和有关规定,技术措施也尚不能消除生产过程中的危险、危害因素,或在进行应急抢险、救灾作业时,佩戴劳动防护用品就成为既能完成生产任务又能保证从业
datagridview中 ContextMenuStrip的使用 datagridview使用
在datagridview中使用ContextMenuStrip ,1、添加ContextMenuStrip控件2、设置ContextMenuStrip的items3、设置datagridview的RowTemplate.ContextMenuStrip为ContextMenuStrip1最关键的是关联上去以后,需要怎么传值4、需要添加datagri
PreTranslateMessage使用与使用说明 translatemessage
在MFC里面,Pretranslatemessage是一个很重要的虚函数。这个函数的作用这里就不谈了,很多地方都有涉及,这里只谈一下其实现的机制。谈到PretranslateMessage的实现,便不得不谈到MFC消息循环的实现。MFC通过CWinApp类中的Pumpmessage函数