Правильный способ многопоточности в c++ с использованием библиотеки boost

У меня есть dll C++, и я использовал библиотеку ускорения для реализации многопоточности, а затем я хотел бы использовать эту dll в программе C#.
Я сделал это, и моя программа работает, как я и ожидал, и в моей системе нет никаких проблем. Когда я создаю установщик с помощью Расширенный установщик и устанавливаю его как новую программу в моей системе (что Разрабатывал на нем приложение) тоже все ок и проблем нет. Но когда я установил эту программу в другие системы и запустил ее, сначала программа будет работать нормально, но когда она захочет создать потоки и запустить их, программа будет остановлена.
Часть моих кодов в 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());
    }
}

Кто-нибудь может помочь мне решить эту проблему, пожалуйста?
Заранее спасибо.


person s.a.t    schedule 15.12.2015    source источник
comment
проверить зависимости stackoverflow.com/questions/10818717/   -  person volody    schedule 16.12.2015


Ответы (1)


Boost.thread — одна из немногих библиотек повышения, которые не предназначены только для заголовков, и им нужна скомпилированная библиотека. Скорее всего, вы связали свой код с динамической версией boost.thread.

Ваши решения:

  1. Ссылка со статической версией boost.thread
  2. Включите динамическую библиотеку в свой дистрибутив.
person SergeyA    schedule 15.12.2015
comment
Спасибо @SergeyA за ваш ответ. Я добавил библиотеки повышения и файлы заголовков на страницах свойств проекта -> Свойства конфигурации -> Дополнительные каталоги, а также в дополнительных каталогах включения и дополнительных каталогах библиотек, а также я добавил эти файлы в C /C++ -> Общие -> Включить каталоги и компоновщик -> Общие -> Каталоги библиотек. Можете ли вы объяснить мне, что еще я должен сделать, пожалуйста? - person s.a.t; 16.12.2015