读书人

互斥量和临界区的有关问题?如何出现这

发布时间: 2013-11-19 22:55:29 作者: rapoo

互斥量和临界区的问题?怎么出现这种情况?
//互斥量 为什么这的线程访问都是执行一次就切换了。




//临界区 为什么这的线程访问都是执行一次没有切换线程呢。



如何实现三者顺序同步访问。比如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
[解决办法]
引用:
Quote: 引用:


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);
.......



你这把三个线程都隔离了。直接可以单开了。没必要临界区了。

你代码是sleep的问题,sleep下移就行,原因已在7L说了,前面是没看清楚题目
[解决办法]
问题已经上面已经提到了。实现顺序的话,就得自己同步了。

上面的代码最多算个互斥。算不上同步。

读书人网 >VC/MFC

热点推荐