为什么线程同步会出问题

时间:2022-08-25 02:24:55
我在一个线程中不断的从串口中读数据并把它放在一个cstring类中
在另一个线程中我从cstring中取出数据
但是我调试的时候发现串口前几次可以正常读取.. 但在后面却返回了995的错误标号(由于线程退出或应用程序请求,已放弃 I/O 操作。 )
而且在另一个线程中读cstring的时候会出错(提示:user breakpoint called from code at 0x7c92120e)(编译的时候不会出错)
我把代码贴上来请各位帮我看一下
谢谢了

///这是读数据的代码 bh为资源共享区
WaitForSingleObject(Muters,500L );
double dTime = ::timeGetTime()/1000.0;
double dValue[2];
dValue[0] = bh[0];//bh为资源共享区
dValue[1] = 5*sin(4*dTime+5);// 正弦参数的设定

ReleaseMutex(Muters); 
///////////////////////////////////////////////////////////////////////////////////////////
//这是向bh写数据的线程
DWORD WINAPI FunProc(LPVOID LpParaneter)
{
DWORD length=12;
         char ah[14]={"ppppppppppppp"};


while(1)
{
WaitForSingleObject(Muters,4L);
int da=GetLastError();
ReadFile(hCom,ah,12,&length,NULL);//我在这做了一个断点 发现前几次可以读取串口数据...但是后面就返回995    的错误
int d=GetLastError();
ReleaseMutex(Muters); 
int dc=GetLastError();
;
}
return 0;
}
 

9 个解决方案

#1


这个定义一个BUFFER,然后用关键段就可以了

#2


引用 1 楼 zhou1xp 的回复:
这个定义一个BUFFER,然后用关键段就可以了

能说清楚点么..
我刚学mfc
谢谢

#3


你的同步主要保护哪个?
看你代码, 没看出俩个互斥下有操作相同部分的代码 

#4


引用 3 楼 sanguomi 的回复:
你的同步主要保护哪个?
看你代码, 没看出俩个互斥下有操作相同部分的代码

额.. 打漏了..
不好意思

DWORD WINAPI FunProc(LPVOID LpParaneter)
{
    DWORD length=12;
         char ah[14]={"ppppppppppppp"};


    while(1)
    {
    WaitForSingleObject(Muters,4L);
    int da=GetLastError();
    ReadFile(hCom,ah,12,&length,NULL);//我在这做了一个断点 发现前几次可以读取串口数据...但是后面就返回995    的错误
    bh+=ah;// 刚刚打少了不好意思呀
   .............
    int d=GetLastError();
    ReleaseMutex(Muters); 
    int dc=GetLastError();
    ;
    }    
    return 0;
}

#5


大家帮帮我呀..
谢谢了..

#6


WaitForSingleObject 的返回值必须是 WAIT_OBJECT_0 才可以继续操作的,你没有检查返回值啊

#7


同楼上。。。
if(WAIT_OBJECT_0!=WaitForSingleObject(Muters,4L))
{
return;
}
……

#8


引用 6 楼 lazy_2010 的回复:
WaitForSingleObject 的返回值必须是 WAIT_OBJECT_0 才可以继续操作的,你没有检查返回值啊

这个没注意到...
谢谢了..

#9


引用 7 楼 vivvan 的回复:
同楼上。。。
if(WAIT_OBJECT_0!=WaitForSingleObject(Muters,4L))
{
return;
}
……

你确定要这么改?
我觉得不应该是这么改的..
首先if(WAIT_OBJECT_0!=WaitForSingleObject(Muters,4L))
这条语句说的是函数的返回值不等于WAIT_OBJECT_0才会执行下面的语句块
也就是说当函数没有取得信号的时候执行...
额.. 这就和我的目的相反 了..
还有
我要的效果是没有取得信号的时候是延时等候.. 直到取得信号再执行下面的语句 
.而兄弟你的建议却是没有取得信号就跳过受保护的语句块

初学C++和MFC.. 说错了请指正..
谢谢

#1


这个定义一个BUFFER,然后用关键段就可以了

#2


引用 1 楼 zhou1xp 的回复:
这个定义一个BUFFER,然后用关键段就可以了

能说清楚点么..
我刚学mfc
谢谢

#3


你的同步主要保护哪个?
看你代码, 没看出俩个互斥下有操作相同部分的代码 

#4


引用 3 楼 sanguomi 的回复:
你的同步主要保护哪个?
看你代码, 没看出俩个互斥下有操作相同部分的代码

额.. 打漏了..
不好意思

DWORD WINAPI FunProc(LPVOID LpParaneter)
{
    DWORD length=12;
         char ah[14]={"ppppppppppppp"};


    while(1)
    {
    WaitForSingleObject(Muters,4L);
    int da=GetLastError();
    ReadFile(hCom,ah,12,&length,NULL);//我在这做了一个断点 发现前几次可以读取串口数据...但是后面就返回995    的错误
    bh+=ah;// 刚刚打少了不好意思呀
   .............
    int d=GetLastError();
    ReleaseMutex(Muters); 
    int dc=GetLastError();
    ;
    }    
    return 0;
}

#5


大家帮帮我呀..
谢谢了..

#6


WaitForSingleObject 的返回值必须是 WAIT_OBJECT_0 才可以继续操作的,你没有检查返回值啊

#7


同楼上。。。
if(WAIT_OBJECT_0!=WaitForSingleObject(Muters,4L))
{
return;
}
……

#8


引用 6 楼 lazy_2010 的回复:
WaitForSingleObject 的返回值必须是 WAIT_OBJECT_0 才可以继续操作的,你没有检查返回值啊

这个没注意到...
谢谢了..

#9


引用 7 楼 vivvan 的回复:
同楼上。。。
if(WAIT_OBJECT_0!=WaitForSingleObject(Muters,4L))
{
return;
}
……

你确定要这么改?
我觉得不应该是这么改的..
首先if(WAIT_OBJECT_0!=WaitForSingleObject(Muters,4L))
这条语句说的是函数的返回值不等于WAIT_OBJECT_0才会执行下面的语句块
也就是说当函数没有取得信号的时候执行...
额.. 这就和我的目的相反 了..
还有
我要的效果是没有取得信号的时候是延时等候.. 直到取得信号再执行下面的语句 
.而兄弟你的建议却是没有取得信号就跳过受保护的语句块

初学C++和MFC.. 说错了请指正..
谢谢