討論區快速選單
知識庫快速選單
網路投保旅行平安險 掌握Salesforce雲端管理秘訣
[ 回上頁 ] [ 討論區發言規則 ]
請教一個跨 Thread 的 Share Memory 的問題
更改我的閱讀文章字型大小
作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/9 上午 11:12:45
我有一個程式,在其中一個 Thread 用 new 一個 struct ,這個 struct 中有一個struct 陣列 min
我的程式片斷是這樣子,

struct stK {
  int idate;
  int itime;
};

struct st {
  int stnum;
  struct stk min[100];
};

st* mTse[100];


void main() {
  int i;
 
  for (i = 0; i < 100; i++) {
    mTse[i] = new st;
  }
}

在另外的 func 中有引用

void func1(int stnum) {
  st *pst;
  stK *pk;
  int i;
  int iloc;

  stK *ppk;

  pst = mTse[stnum];
  pk = pst->min;

  for (i = 0; i < 100; i++) {
    ppk = &(pk[i]);
    iTest = ppk->itime;
    ....
  }
...
}

如果以上的 func1 跟 main 在同一個 Thread 中時,程式可以正常執行,

func1 跟 main 不在同一個 Thread 時就 iTest 會資料錯誤,

請問,這是我那裡觀念錯誤,或是還有其他可能??

作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kuolung註記此篇回應為很有道理 2015/11/9 下午 11:49:13
1.首先要利用Mutex來防止同時存取相同記憶體的情況
2.通過Mutex的控制後, 仍然要檢驗並保持資料內容的可偵測狀態. 例如一個執行緒釋放了某個動態記憶體, 就要將記錄它的變數值設回NULL. 其他執行緒要存取此動態記憶體前, 也要檢驗它是否為NULL. 這個是programmer自己的責任.
作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/10 上午 06:59:38
延續這個問題 因為 mfc postmessage 的機置 如果用 postmessage 來作 thread 間傳送資料 最多只能傳 6個byte lparam 4byte wparam 2byte (如果有錯請指正)

請問有其他機制傳送較多資料的方式
作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/10 上午 07:04:22
再請問 用 share memory 的方式傳送資料 如果只有單向傳送 是不是 可以不用 mux 做管理
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4498 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/10 上午 10:06:22
http://www.boost.org/doc/libs/1_50_0/doc/html/interprocess/sharedmemorybetweenprocesses.html
please see above usage about shared memory in boost library :)
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kuolung註記此篇回應為很有道理 2015/11/11 下午 02:45:29
執行緒之間的資料傳遞, 直接將記憶體的指標送過去即可, 不必使用shared memory (這是process之間傳遞資料用的), 而且也很少會用postmessage來傳遞資料.

執行緒間的處理同步, 多半使用Event. 資料producer執行緒在資料備妥後, 查看那個資料consumer執行緒有空, 將備妥的資料放入該執行緒的記錄空間 (所以執行緒處理的寫法大多會寫成一個物件, 以方便存取這些傳遞用的資料變數), 最後Signal Event, 讓該執行緒去處理放入的資料.

一般1對1 (producer vs consumer), 也就是只有兩個執行緒時, 利用狀態變數值仔細規劃, 基本上是可以不用mutex來防止同時存取的衡突. 但多重執行緒大部份的應用都是1對n, 甚至n對n, 這時只能靠mutex了.
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/11 下午 11:39:34
請樓主把 func1() 跟 main() 在不同 thread 的程式碼貼出來.
作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/13 下午 03:50:11
就很簡單的方式,建一個 mfc 的 CWinThread 的物件
然後在主程式加入

如我的CWinThread 物件為 WinThreadK

在主執行緒中加入

WinThreadK *pWinK;

pWinK = new WinThreadK;
pWink->CreateThread();

傳遞資料的方式為
因為 pWinK 這個 Thread 會建立一個 CView 的視窗hwnd值
所以我傳送資料的方式為

PostMessage(hwndKView, WM_NEWDATA, (WPARAM) index, (LPARAM) data1);

其中 index 為指向一個傳送資料的陣列中的值
我在 KView 中使用 index 的方式為

data1 *pdata;

index = (int)wParam;

pdata = &(AllData[index]);

然後

data = pdata->data1;


作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/13 下午 03:52:23
我目前的情況是 1對 n , 但是只是單向傳遞資料,請問這樣會需要用要 mutex 這個東西嗎
作者 : kuolung(kuolung)
[ 貼文 151 | 人氣 1414 | 評價 130 | 評價/貼文 0.86 | 送出評價 39 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/13 下午 04:30:37
再加一個建 WorkThread 的問題,
因為我是用 mfc 的 Doc/View 的架構建立視 Worker Thread 視窗,在 mfc 會建立一個 pDoctemplate 的東東
不太知道,這個宣告要放在那裡

CMultiDoctemplate* mpDoctemplate;

mpDoctemplate = new CMultiDoctemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(Doc);
    RUNTIME_CLASS(Frame);
    RUNTIME_CLASS(View));
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/13 下午 08:59:39
>就很簡單的方式,建一個 mfc 的 CWinThread 的物件
>然後在主程式加入
>
>如我的CWinThread 物件為 WinThreadK

你原貼文的程式是 console app 啊, 完全沒有提到 MFC!?

不知道你是要寫 MFC app 還是 console app, 要 worker thread 還是 UI thread. 不同的組合做法都不太一樣. 請自己參考以下文章/討論:

  http://www.flounder.com/badprogram.htm

  https://msdn.microsoft.com/en-us/library/windows/desktop/ms682516%28v=vs.85%29.aspx

  http://www.codeproject.com/Articles/5542/Simple-Multithreaded-Application-in-pure-C-Win-a

  http://www.drdobbs.com/windows/managing-ui-threads-with-cwinthread/184416859

  http://www.codeguru.com/cpp/misc/misc/threadsprocesses/article.php/c3761/UIThread-Demonstration.htm

  http://www.codeproject.com/Articles/13557/Creating-Threads-using-the-CreateThread-API

  http://computer-programming-forum.com/82-mfc/b49bde6e04c5e23e.htm

  http://forums.codeguru.com/showthread.php?273481-CWinThread-SendMessage


>再加一個建 WorkThread 的問題,
>因為我是用 mfc 的 Doc/View 的架構建立視 Worker Thread 視窗,在 mfc 會建立一個 pDoctemplate 的東東

那這應該是 UI thread 了吧.

>不太知道,這個宣告要放在那裡
>
>CMultiDoctemplate* mpDoctemplate;

上面這個放在 CWinApp 衍生的 class 裡.


>mpDoctemplate = new CMultiDoctemplate(
> IDR_MAINFRAME,
> RUNTIME_CLASS(Doc);
> RUNTIME_CLASS(Frame);
> RUNTIME_CLASS(View));

上面這個加入在上述 class 的 InitInstance() 成員定義裡.

作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/24 上午 10:23:17
>我目前的情況是 1對 n , 但是只是單向傳遞資料,請問這樣會需要用要 mutex 這個東西嗎
1的資料尚未備妥,要不要防止n去讀取資料?
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.171875