使用boost库是c++中实现多线程的正确方法

本文关键字:方法 多线程 实现 boost 库是 c++ 使用 | 更新日期: 2023-09-27 18:26:52

我有一个C++dll,我用boost库实现了多线程,然后我想在C#程序中使用这个dll
我做到了,我的程序按预期运行,我的系统没有任何问题。当我使用Advanced installer创建一个安装程序,并将其作为一个新程序安装在我的系统中时(我已经在上面开发了应用程序),一切都很好,没有任何问题。但当我在其他系统中安装这个程序并运行它时,起初,程序会正常运行,但当它想创建线程并运行它们时,程序会停止
我在C++dll中的一部分代码如下:

struct ThreadParams
{
    int thetaStart,
        thetaEnd,
        rStart;
    vector<string> files;
}thParams;
const int NUM_OF_THREADS = 5;
extern "C"
{
    __declspec(dllexport) int __stdcall Start(const char *path)
    {
        thParams.files = listFilesInDirectory(path);
        int step = thParams.files.size()/NUM_OF_THREADS;
        thParams.rStart = 1;
        thParams.thetaStart = 0;
        thParams.thetaEnd = 360;
        boost::thread_group tgroup;
        FILE *output_text;
        char *buffer = new char[128];
        for (int i = 0; i < NUM_OF_THREADS; i++)
        {   
            sprintf(buffer,"out%d.txt",i+1);
            output_text = fopen(buffer,"wt");
            int start  = i*step;                
            int end  = (thParams.files.size() - (start+step)) >= step ? (start+step) : thParams.files.size();
            tgroup.create_thread(boost::bind(ThreadProcess,start,end,output_text,i+1));
        }
        tgroup.join_all();
        _fcloseall();
        delete buffer;
        buffer = NULL;
    }
}
void ThreadProcess(int start, int end, FILE *out, int threadID)
{
    for(int i = start; i < end; ++i)
    {
        fprintf(out,"%s'n",thParams.files[i].c_str());
    }
}

有人能帮我解决这个问题吗
提前谢谢。

使用boost库是c++中实现多线程的正确方法

Boost.thread是为数不多的不是头的Boost库之一,它们需要一个编译后的库。最有可能的是,您将代码与boost.thread.的动态版本链接起来

您的解决方案:

  1. 链接到boost.thread的静态版本
  2. 在分发中包含动态库