2015-11-08 91 views
0

我需要將二進制數據傳遞給本地線程。 我使用std :: string來保存二進制數據,我想出了一個想法如何將std :: string傳遞給本地字符串,並且想知道它是否安全。將std :: string傳遞給本地線程

#include <Windows.h> 
#include <iostream> 
#include <string> 

using namespace std; 


DWORD WINAPI MyThreadFunction(LPVOID lpParam) 
{ 
    string binaryDataInThread = string(*(string*)lpParam); // copy data to current thread 
    while (true) 
    {// do some stuff with binaryDataInThread 
     cout << "thread binaryData size: " << binaryDataInThread.size() << endl; 
     Sleep(1000); 
    } 

    return 0; 
} 


int main(int argc, char *argv[]) 
{ 
    { 
     string binaryDataInMain; 
     for (int i = 0; i < 500; i++) 
      binaryDataInMain += (char)i; 
     CloseHandle(CreateThread(NULL, NULL, MyThreadFunction, &binaryDataInMain, NULL, NULL)); 
     Sleep(1000); // wait for thread to copy data 
    } // destroy binaryDataInMain 
    system("pause"); 
    ExitProcess(0); 
} 

binaryDataInThread的大小是500,所以所有的二進制數據都成功通過了。但安全嗎?

回答

0

否您的方法不保存,儘管它不可​​能失敗。在奇怪的情況下,即使是等待線程複製數據的秒數也是不夠的。

建議:

  • 使用C++線程。
  • 如果由於某些奇怪的原因您不能使用C++線程,請修正這些原因!
  • 如果您將數據傳遞給您想避免共享的線程,請使用new動態分配數據。當然,線程將負責使用delete發佈數據!
  • 如果您想與線程共享數據,請使用各種可用的同步原語(互斥,事件等)來同步對它的訪問。
  • 或者,對原始類型使用原子操作。然而,無鎖編程很難,正確的無鎖編程更難。對於初學者,這是而不是