将std :: string传递给本机线程

时间:2015-11-08 10:55:11

标签: multithreading visual-c++

我需要将二进制数据传递给本机线程。 我使用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,因此所有二进制数据都已成功通过。但它安全吗?

1 个答案:

答案 0 :(得分:0)

没有你的方法不能保存,虽然不太可能失败。在奇怪的情况下,即使是第二个等待线程复制数据也是不够的。

建议:

  • 使用C ++线程。
  • 如果由于某些奇怪的原因你无法使用C ++线程,请修复这些原因!
  • 如果将数据传递给要避免共享的线程,请使用new动态分配数据。当然,该线程将负责使用delete
  • 发布数据
  • 如果要与线程共享数据,请使用各种可用的同步原语(互斥,事件等)同步对它的访问。
  • 作为替代方案,对原始类型使用原子操作。但是,无锁编程很难,正确的无锁编程更加困难。这对于初学者来说不是