2015-11-08 57 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发布数据!
  • 如果您想与线程共享数据,请使用各种可用的同步原语(互斥,事件等)来同步对它的访问。
  • 或者,对原始类型使用原子操作。然而,无锁编程很难,正确的无锁编程更难。对于初学者,这是而不是