2011-03-28 56 views
-1

我正在处理多个生产者和单个消费者问题。我想要在线程函数中传递像1,2,3这样的线程,以便可以根据这些编号来命名单个线程。在线程函数中传递整型数组

但创建线程后,计数7后崩溃的程序。我认为问题是由于 变量nThreadNo; 如果我限制小于7的计数,它可以正常工作。但是如果我计数超过这个,它会崩溃。

void CEvent1Dlg::CreateProducerThreads() 
{ 

    try 
    { 
     nThreadNo = new int20]; 
     memset(nThreadNo,0,20); 
     if (nThreadNo ==NULL) return; 
    }catch(...) 
    { 
     MessageBox(_T("Memory allocation Failed"),_T("Thread"),1); 
     return ; 
    } 
    int i = 0; 
    for (i = 0;i<20;i++) 
    { 
     //nThreadNo = i+1; 
     nThreadNo[i] = i+1; 
     hWndProducer[i] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ProducerThrdFunc,(void*)(nThreadNo+i),0,&dwProducerThreadID[i]);  
     if (hWndProducer[i] == NULL) 
     { 
      //ErrorHandler(TEXT("CreateThread")); 
      ExitProcess(3); 
     } 
    } 
    //WaitForMultipleObjects(20,hWndProducer,TRUE,INFINITE);    
} 

DWORD WINAPI ProducerThrdFunc (LPVOID n) 
{ 
    int *nThreadNo = (int*)n;  
    char chThreadNo[33]; 
    memset(chThreadNo,0,33); 

    while(1) 
    { 
     itoa(*nThreadNo,chThreadNo,10); 
     char* pMsg1 = new char[100]; 
     char* pMsg2 = new char[100]; 
     memset(pMsg1,0,100); 
     memset(pMsg2,0,100); 

     strcpy(pMsg1,"Producer ");  
     strcat(pMsg1," Thread No:");   
     strcat(pMsg1,chThreadNo); 

     if (stThreadInfoProd.pEventQueue->AddTail(pMsg1)==TRUE) 
     { 
      strcpy(pMsg2,"Producer ");  
      strcat(pMsg2," Thread No:");   
      strcat(pMsg2,chThreadNo); 
      strcat(pMsg2," Added the Msg"); 
     } 
     else 
     { 
      strcpy(pMsg2,"Producer ");  
      strcat(pMsg2," Thread No:");   
      strcat(pMsg2,chThreadNo); 
      strcat(pMsg2,"failed to Add the Msg");  
     } 
     PostMessage(stThreadInfoProd.hWndHandle,UWM_ONUPDATEPRODUCERLIST,(WPARAM)pMsg2,0); 
     strcat(pMsg1," Adding Msg:"); 
     //PostMessage(stThreadInfoProd.hWndHandle,UWM_ONUPDATEPRODUCERLIST,(WPARAM)pMsg2,0);   
     Sleep(3000); 
    } 
    return 0; 
} 

回答

2
  1. 您归零前20个字节的nThreadNo,不是第一20 * sizeof(int)字节你应该做。
  2. 此代码中还有其他数组正在编入索引:hWndProducerdwProducerThreadID。这些元素是否还有足够的元素?
+0

哦,是的,这是一个愚蠢的错误.thanks.it正在工作。 – 2011-03-28 13:38:46

+0

1.我认为我在使用新的不是malloc,它会处理这些。我不确定。我正确 – 2011-03-28 13:40:19

1

CreateThread呼叫被传递整数值,但是该线程功能本身被处理它作为一个指针为整数。而不是这样的:

int *nThreadNo = (int*)n; 

这也许应该是:

int nThreadNo = (int)n; 

编辑:我在通话更仔细地看了看,我也看到它传递一个整数指针。但是,该值是堆栈数据,在线程尝试读取它时可能不存在。因此,它应该可能只是传递整数值:(void*)(nThreadNo[i])

+0

在这种情况下,它会显示类似00089的值。我猜这样会打印内存地址 – 2011-03-28 13:35:40

0

此行

if (nThreadNo ==NULL) return; 

是毫无价值的。

现代C++中的new运算符在失败时不会返回NULL,但会抛出异常,但即使您使用的分配器返回NULL来指示失败,但检测到它已为时过晚,您已经将NULL指针传递给memcpy