互斥量和临界区的问题?怎么出现这种情况?
//互斥量 为什么这的线程访问都是执行一次就切换了。
//临界区 为什么这的线程访问都是执行一次没有切换线程呢。
如何实现三者顺序同步访问。比如1......2.......3.........一直这样的顺序
[解决办法]
XP,VS2008,临界区没有出现上述现象,跟互斥量结果类似。
要实现3者同步,可以用3个event,A通知B,B通知C,C通知A
[解决办法]
你现在是要什么效果?三个线程轮流访问?
[解决办法]
CRITICAL_SECTION gcs1;
CRITICAL_SECTION gcs2;
CRITICAL_SECTION gcs3;
DWORD WINAPI ThreadProc1 (LPVOID lp)
{
while (TRUE)
{
EnterCriticalSection(&gcs1);//下面对应改
cout<<"thread 1 .............."<<endl;
Sleep(100);
LeaveCriticalSection(&gcs1);
}
return 1;
}
.....
int main(void)
{
InitializeCriticalSection(&gcs1);
InitializeCriticalSection(&gcs2);
InitializeCriticalSection(&gcs3);
.......
[解决办法]
唔,明白你的问题了,你意思是说没有切换线程是吧
[解决办法]
你的while循环的问题
while (TRUE)
{
EnterCriticalSection(&gcs);
cout<<"thread 1 .............."<<endl;
Sleep(100);//sleep时机不对,没有让出时间片,应该解锁完成后让出时间片
LeaveCriticalSection(&gcs);//解锁,while继续,
}
[解决办法]
“如何实现三者顺序同步访问。比如1......2.......3.........一直这样的顺序”
需要额外的 逻辑 控制 顺序。
或者 用 纤程 FIBER。
[解决办法]
加了个 变量:
#include <Windows.h>
#include <iostream>
using namespace std;
#define MAX_NUM 3
HANDLE gHmutex;
int tswitch=0;
DWORD WINAPI ThreadProc1 (LPVOID lp)
{
while (TRUE)
{
WaitForSingleObject(gHmutex,INFINITE);
if((tswitch % 3)==0)
{
cout << "thread 1 .............." << endl;
tswitch ++;
}
ReleaseMutex(gHmutex);
Sleep(100);// or Sleep(0)
}
return 1;
}
DWORD WINAPI ThreadProc2 (LPVOID lp)
{
while (TRUE)
{
WaitForSingleObject(gHmutex,INFINITE);
if((tswitch % 3)==1)
{
cout << "thread 2 .............." << endl;
tswitch ++;
}
ReleaseMutex(gHmutex);
Sleep(100);
}
return 2;
}
DWORD WINAPI ThreadProc3 (LPVOID lp)
{
while (TRUE)
{
WaitForSingleObject(gHmutex,INFINITE);
if((tswitch % 3)==2)
{
cout << "thread 3 .............." << endl << endl;
tswitch ++;
}
ReleaseMutex(gHmutex);
Sleep(100);
}
return 3;
}
int main(void)
{
DWORD dwID[MAX_NUM];
gHmutex=CreateMutex(NULL,FALSE,NULL);
CreateThread(NULL,0,ThreadProc1,(LPVOID)0,0,&dwID[0]);
CreateThread(NULL,0,ThreadProc2,(LPVOID)0,0,&dwID[1]);
CreateThread(NULL,0,ThreadProc3,(LPVOID)0,0,&dwID[2]);
Sleep(1000*15);
return 0;
};
int tswitch=0;// ThreadSwitch
[解决办法]
你代码是sleep的问题,sleep下移就行,原因已在7L说了,前面是没看清楚题目
[解决办法]
问题已经上面已经提到了。实现顺序的话,就得自己同步了。
上面的代码最多算个互斥。算不上同步。