多线程使用了临界区,是否还要使用WaitForSingleObject?该怎么处理
多线程使用了临界区,是否还要使用WaitForSingleObject?
我用用多线程分词之后,统计含某个词语的语句。
1.多线程使用了临界区总计含某个词语的语句,是否还要使用WaitForSingleObject?
2.WaitForSingleObject是等待单个事件,如果使用了5个线程,
如何设置等待事件,确保5个线程均完成了分词?
------解决方案--------------------
WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。
------解决方案--------------------
5个线程 要么开5个WaitForSingleObject
要么用多对象的函数
------解决方案--------------------
用WaitForMultipleObjects等待多个事件对象是否是信号态,一旦有一个事件对象处于信号态,则开始执行后面的语句。
------解决方案--------------------
用不用都行
------解决方案--------------------
1:对于问题一,不用wait就可以,你已经用临界区保护了那个变量。
2:WaitForSingleObject是等待单个事件,如果使用了5个线程,
如何设置等待事件,确保5个线程均完成了分词?这种情况下你应该使用信号量了,每当你的一个语句被线程分析完毕后,将信号量有效,然后你创建N个信号资源,不能采用waitforobject函数,lz可以先阅读下windows核心编程对信号量介绍的章节,定会所体会。因为你这里是需要等待1000个事情都完成,而不是1000个线程有效,所以。
我用用多线程分词之后,统计含某个词语的语句。
- C/C++ code
vector <string> Sentencevec[1000];//保存有1000个语句 struct GaSegNode { char justr[40];//语句 char Gabuf[60];//分词结果 }; DWORD dwThreadGaSegN[10]; HANDLE GaSeghn[10]; //总计包含特定词语的语句 int sumsentence=0; CRITICAL_SECTION g_cs; void Init( ) { InitializeCriticalSection( &g_cs ); } DWORD WINAPI GaSegN(LPVOID lpParam) //// 线程函数 { char Gabuf[60]="";//暂存分词结果 GaSegNode* pData = (GaSegNode*)lpParam; //下面是具体的分词函数 ParagraphProcess(pData->justr,Gabuf);// 把pData->justr分词后,返回到Gabuf 分词结果 EnterCriticalSection( &g_cs ); if(AnalyesePara(Gabuf)){ sumsentence++; } LeaveCriticalSection( &g_cs ); return 0; } void OnStartGaSegN(int n)//n是Sentencevec的序号 { GaSegNode* pData; for(int i=0; i<1000; i++ ) { //对Sentencevec[n+i]的语句, //指派给分词线程GaSegN } //已经使用了临界区,此处的sumsentence是否立即有效 WaitForSingleObject//是否还要设置等待或其它机制 int x=sumsentence; }
1.多线程使用了临界区总计含某个词语的语句,是否还要使用WaitForSingleObject?
2.WaitForSingleObject是等待单个事件,如果使用了5个线程,
如何设置等待事件,确保5个线程均完成了分词?
------解决方案--------------------
WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。
------解决方案--------------------
5个线程 要么开5个WaitForSingleObject
要么用多对象的函数
------解决方案--------------------
用WaitForMultipleObjects等待多个事件对象是否是信号态,一旦有一个事件对象处于信号态,则开始执行后面的语句。
------解决方案--------------------
用不用都行
------解决方案--------------------
1:对于问题一,不用wait就可以,你已经用临界区保护了那个变量。
2:WaitForSingleObject是等待单个事件,如果使用了5个线程,
如何设置等待事件,确保5个线程均完成了分词?这种情况下你应该使用信号量了,每当你的一个语句被线程分析完毕后,将信号量有效,然后你创建N个信号资源,不能采用waitforobject函数,lz可以先阅读下windows核心编程对信号量介绍的章节,定会所体会。因为你这里是需要等待1000个事情都完成,而不是1000个线程有效,所以。