程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 關於多線程編程中與全局變量通信的問題

關於多線程編程中與全局變量通信的問題

編輯:.NET實例教程
 這二天在做一個東東,功能是這樣的。主線程往list寫數據,數據元素類型是char*,即聲明list變量是這樣的:list<char*> g_pList。而其他次線程要做的事是讀取這個list中的數據,次線程會利用這些數據做些事情。

        好了,讓我們來看看代碼吧。

main Thread:

void SomeFun(void)

{

.......

 EnterCriticalSection(&g_csForList);                       //通過臨界區實現同步(不知這個說法是否正確)
  g_pList.push_back(p);
  LeaveCriticalSection(&g_csForList);

.......

}

Sub_Thread:

DWord WINAPI Sub_Thread(pvoid pv)

{

  for (list<const TCHAR*>::iterator iter = g_pList.begin();
     iter != g_pList.end();  iter ++)
{

// do something

}

}

代碼就是這麼點。呵呵

接著就是debug了,發現在sub_Thread中,我始終無法獲取push進去的數據。但在main thread 這個SomeFunc函數可以獲取push到list中的數據,但為什麼在Sub_thread無法獲取,搞了半天,查了一些資料,最後發現原來是這樣的:

       在我的主線程的SomeFunc這個函數中,變量p只是一個局部指針變量,對局部指針變量,我們知道出了函數體,它的內容是通常不會是原來寫的數據。這樣,我們可以解釋為什麼在SomeFunc這個函數體內,而到我們的Sub_Thread體內無法獲取數據了。好了,既然找到了問題,那無法就new來處理這個問題了。當我不知道如何在erase 這些節點時同時釋放new出來的內存,請高手指教。

       從這裡我們也可以看出,語言基礎是十分重要的。這個問題在林銳的高質量講過,但我這個問題應該是變相的返回一個局部指針變量,在這寫出來有二點希望各位注意:

1、並不是所有的多線程問題和同步或線程之間的配合有關

2、要把語言基礎夯實

歡迎你與我交流,我的QQ:99282122.謝謝!



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved