//---------------stdafx.h
typedef queue<Frame*> FrameToBeParsedQueue;
typedef struct
{
FrameToBeParsedQueue frameQueue;
HANDLE m_mutex;
}frameInQueue;
extern frameInQueue *pFrameInQueue;
//------------stadafx.cpp
//供线程访问的全局变量
frameInQueue *pFrameInQueue=(frameInQueue*)GlobalAlloc(GPTR,sizeof(frameInQueue));
// ---------CwebBrowserDlg中的线程函数,该函数的作用是将文件中的信息读取出来组装成Frame,然后放入全局队列
DWORD WINAPI CWebBrowserDlg::RecoveryProc(LPVOID lpParameter)
{
int TimerID = 0;
while( ( ((RecoverPara*)lpParameter)->ifs->read(((RecoverPara*)lpParameter)->pData, 2) )
&& ( !( (RecoverPara*)lpParameter)->bExit ) ) //从二进制文件读取信息至文件结束,或者停止处理当前数据文件
{
int length = Utils::ConvertFromBytes((unsigned char *)(((RecoverPara*)lpParameter)->pData), 0, 2);//获取IP数据包长度
unsigned char * data = new unsigned char[length];
((RecoverPara*)lpParameter)->ifs->read((char*)data, length);//按照IP数据包长度提取数据包
//将Frame放入队列
int timeToSleep=1;
while (pFrameInQueue->frameQueue.size()>100)
{
Sleep(timeToSleep);
if(timeToSleep<1000)
timeToSleep*=2;
}
DWORD result=WaitForSingleObject(pFrameInQueue->m_mutex,INFINITE);
if (result==WAIT_OBJECT_0)
{
Frame * f = new Frame(data, length);
pFrameInQueue->frameQueue.push(f);
ReleaseMutex(pFrameInQueue->m_mutex);
}
delete[] data;
}//while循环结束
((RecoverPara*)lpParameter)->ifs->close();
((CWebBrowserDlg*)((RecoverPara*)lpParameter)->pDlg)-> m_bFileEnd = TRUE;
//释放在OnStart函数内申请的各对象的存储空间,RecoveryWrapper\ifstream\RecoverPara\Char[]
delete ((RecoverPara*)lpParameter)->pWrapper;
delete ((RecoverPara*)lpParameter)->ifs;
delete ((RecoverPara*)lpParameter)->pData;
delete lpParameter;
return 0;
}
//---------以下是RevoverWrrapper类中线程函数,作用是从全局队列中取得Frame,并处理
DWORD WINAPI RecoverWrapper::RecoveryProc_ParseFrame(LPVOID lpParameter)
{
DWORD result=-1;
para *pfiq=(para*)lpParameter;
while(TRUE)
{
if((pFrameInQueue->frameQueue).size()>0)
{
result=WaitForSingleObject(pFrameInQueue->m_mutex,INFINITE);
if (result==WAIT_OBJECT_0)
{
Frame *f =(pFrameInQueue->frameQueue.front());
pfiq->handler->ParseFrame(f);
delete f;
pFrameInQueue->frameQueue.pop();
ReleaseMutex(pFrameInQueue->m_mutex);
}
}
else
Sleep(50);
}
return 0;
}
程序运行没问题,但结果存在问题,请大家帮我看一下问题出在哪里?我特别想知道:
(1)我在一个线程中Frame *f=new Frame()产生了一个对象指针,并将这个指针存到全局队列中,这个操作有什么问题吗?其他线程能够通过全局队列访问到这个Frame对象吗?我的这种设计思想有什么问题吗?
(2)我的线程同步是通过mutex完成的,不知道问题是不是出在线程的同步上。
VC多线程访问同一全局变量的问题
ReleaseMutex(pFrameInQueue->m_mutex); 需要成对的出现.你在if判断里边释放一次 但是如果if条件不成立,你就没有调用释放.这样的结果就是互斥量mutex被锁定,其他线程无法调用.在2个if判断外加上释放mutex的语句再试一试
C#多线程同用一个全局变量,如何保持每个线程的变量不会被别的线程把值...
HashTable,每个线程用key往自己的value里面写东西,外界通过key访问每个线程写的东西,同理,dataTable也行啊,只要用标识区分开不同的row就可以了,或是每个线程一个dataTable,都放到dataSet中,通过表名就取到了
多线程之间共享的全局变量需要什么条件
1、线程安全:多线程访问共享全局变量时,需要保证每个线程都能正确地读取和修改全局变量的值,而不会出现数据不一致或者数据竞争的问题。可以通过加锁或者使用线程安全的数据结构来实现线程安全。2、同步性:多线程之间共享的全局变量需要在多个线程之间保持同步,以保证所有线程都能正确地读取和修改全局变量...
多线程读一个全局变量要不要加锁?还是说只是当修改全局变量的时候...
如果所有线程都只读取该变量的话不必加锁,因为仅读取不存在破坏数据的风险,如果有线程写该变量的话不管读取还是写入都要加锁的。windowsAPI提供了一种Sim读写锁,允许所有读线程在同一时刻访问该资源,而写线程在写入时独占资源。
多线程同时调用一个循环会冲突么
会。当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,会发生数据冲突问题,也就是线程安全问题。循环是程序设计语言中反复执行某些代码的一种计算机处理过程,常见的有按照次数循环和按照条件循环。
多个线程同时调用一个函数的情况
记录1:函数里面要用到数据 ,如果数据属于性线程级别的(比如函数形参-->局部变量-->存在栈上--> 每个线程都有自己的栈 ),那么多线程同时调用是没关系的,因为用的都是本线程的数据;但是如果函数用到一些全局数据,比如全局变量,根据堆内存首地址去访问的堆内存(形参传入的),同时操作一个数据结构...
vc多线程修改同一个全局变量,如何加锁
CRITICAL_SECTION cs; \/\/ 全局变量 ::InitializeCriticalSection( & cs); \/\/ 初始化锁 ::EnterCriticalSection( & cs); 获得锁 ... ::LeaveCriticalSection( & cs); \/\/ 释放锁 ... ::DeleteCriticalSection( & cs); \/\/ 删除锁---解决方案---探讨引用:C\/C++ codeCRITICAL_SECTION cs; ...
delphi多线程操作同一个listview,怎么办
\/\/线程单元内 uses SyncObjs;\/\/定义一个全局变量 var CS: TCriticalSection;在操作LV之前调用:CS.Enter;操作完成后:CS.Leave;initialization CS := TCriticalSection.Create;finalization CS.Free;线程中操作VCL很正常,比如多线程下载列表就有可能会用到 ...
Windows线程同步的四种方式
在多线程的程序中,很少有多个线程能在其生命期内进行完全独立的操作;通常情况是一些线程进行某些操作,而其他的线程必须对其操作后的结果进行了解。如果不采取同步机制,其他线程会在线程处理任务前访问处理结果,这样会产生错误的了解。例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题;若一个线程负...
C++ 多线程访问同一变量问题
DLL;DLL 需传出char *类型 [DllImport(“MyTest.dll")]\/\/ 传出值 public static extern int test(StringBuilder data);\/\/C++ DLL中申明 char* data = NULL;extern “C” __declspec(dllexport) int WINAPI setdata(char * buff){ \/\/改变data data = buff;return 0;} ...