我这个题目的背景是这样的,有2个人A与B。A主要负责粗处理,面对的是大量数据,处理单个数据时间短。
B是处理A的结果进行精确处理,处理单个数据时间长。一个实际的例子就是A淘金,去掉样本中石头。B对A的结果进行精加工。考虑到尽量能够实时地给用户结果。采用了多线程的方式处理。这2种处理方式不考虑
1、A处理完之后全部给B,B全部处理完,然后反馈结果给用户。
2、A挑好一块粗金然后交给B(此时A停止),B加工好反馈结果之后,A再处理下一块。
这2种方式都可以用单线程处理我的想法是这样的。启用2类线程。A为主线程。当A找到一块粗金后,就传参启动一个B线程。但这样B线程会启动很多,如何解决互斥的问题?传递的参数是封装了一个类指针,以及需要处理的数据的结构体指针的地址。进过测试,如果同时存在2个B线程,就会发生错误。线程中没有解决好互斥。还有一种考虑方法。也是A与B线程。当A找到一块粗金后,开始建立链表,将链表头指针传递给B线程(并且启用标记)。B线程处理该链表数据。当A继续发现了粗金后,由于标记启用,则往链表添加数据。当B线程处理这个链表到最后时候。把A中标记置空。A再次遇到粗金后就释放原链表,开始新建新的链表。个人觉得这个方法应该没思路上的问题,但调试的时候找不到错误原因,
5F40E4A2   mov         ecx,dword ptr [eax+20h],报错为这个。断在一个SetWindowsText上。这是A线程的static struct_row* head=NULL; //链表头指针
static struct_row* New=NULL; //链表新建指针
static struct_row* pointer=NULL; //链表最后一个指针if (bthread1) //还没建立一个子线程
{
bthread1=!bthread1; if (head!=NULL) //下次建立前要释放
{
struct_row * ptemp;
while (head!=NULL)
{
TRACE("正式释放\n");
ptemp=head;   
head=head->next;   
delete ptemp;
}
head=NULL;
New=NULL;
pointer=NULL;
TRACE("释放完毕\n"); MSG msg;
DWORD dwTimeStarted;
dwTimeStarted = ::GetTickCount();
UINT LFactor=2000;    //延时时间

while   (::GetTickCount() - dwTimeStarted < LFactor)   
{  
if   (PeekMessage(&msg,0,0,0,PM_REMOVE))  
{  
TranslateMessage(&msg); 
DispatchMessage(&msg);                
}         

} TRACE("新建线程\n");
New=new struct_row;
New->irow=iRow;
New->szPath=FilePath;
New->next=NULL;
head=New;
pointer=New; struct1 struct_Temp;
struct_Temp.pRow=New;
struct_Temp.pDlg=this; hThread1=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc1,
(LPVOID)&struct_Temp,
0,
&ThreadID1);
}
else
{
TRACE("加结点%d\n",iRow);
New=new struct_row;
New->irow=iRow;
New->szPath=FilePath;
New->next=NULL;
pointer->next=New;
pointer=New; }
iRow++; //别忘记iRow++
} struct1 *pst=(struct1*)(lpParam);
struct_row * pHead=pst->pRow; if (!(pst->pDlg->bthread1)) //表示已经建立了进程
{
while(pHead!=NULL)
{
int irow=pHead->irow;
CString szPath=pHead->szPath; TRACE("使用结点:%d\n",irow);

MSG msg;
DWORD dwTimeStarted;
dwTimeStarted = ::GetTickCount();
UINT LFactor=500;    //延时时间

while   (::GetTickCount() - dwTimeStarted < LFactor)   
{  
if   (PeekMessage(&msg,0,0,0,PM_REMOVE))  
{  
TranslateMessage(&msg); 
DispatchMessage(&msg);                
}         


//………………处理代码
pHead=pHead->next;

}
pst->pDlg->bthread1=true;
TRACE("开始释放\n");
}

解决方案 »

  1.   

    继续查找,发现是B线程中指针引用的问题。A传值传给B的时候,到运算那一步B中该指针为空…… 
     
    感觉还是A与B线程没隔离好 
     
    如果第一个思路如何实现?如何实现B类线程彼此之间互斥?
      

  2.   

    struct1 struct_Temp;
                        struct_Temp.pRow=New;
                        struct_Temp.pDlg=this;                    hThread1=CreateThread(NULL,
                            0,
                            (LPTHREAD_START_ROUTINE)ThreadFunc1,
                            (LPVOID)&struct_Temp,
                            0,
                        &ThreadID1);
    ----------------------------------------
    你传递给线程的参数是临时的结构体变量???
      

  3.   

    我后来为全局变量了,传的地址,但依然有问题。
    后来是在A中建立B线程后,就延迟2000ms,就没问题了。。