boost: поток аварийно завершает работу компилятора Microsoft C ++ - PullRequest
2 голосов
/ 21 августа 2009

Краткая версия моего вопроса:

Этот код вызывает сбой компилятора.

pThread[0] = new boost::thread(
boost::bind(
    &cGridAnimator::DoJob,  // member function
       this ),                 // instance of class
       0 );                 // job number

Компилятор падает при попытке скомпилировать этот код. (При запуске этого кода происходит сбой не моей программы!)

Что нужно исправить?


Длинная версия вопроса

Я делю работу над большой трехмерной сеткой на 8 отдельных заданий для выполнения в отдельных потоках, чтобы использовать преимущества 8-ядерного компьютера.

Это прекрасно работает:

    JOB_LOOP {
        pThread[kjob] = new boost::thread( ::DoJob, kjob );
    }

Глобальная бесплатная функция DoJob считывает данные из глобального экземпляра cGridAnimator в соответствии с номером задания.

Однако мне не нравятся все эти глобальные переменные, плавающие вокруг, и мне не нравится, когда приходится использовать так много методов доступа, чтобы получить необходимые данные. Было бы намного удобнее использовать метод cGridAnimator.

Отсюда и код в верхней части этого вопроса.

Однако, когда я компилирую его в MSVC ++ 2008, компилятор выдает следующие жалобы, а затем вылетает.

1>Compiling...
1>mfm1.cpp
1>C:\Program Files\boost\boost_1_38_0\boost/bind.hpp(1643) : warning C4180: qualifier applied to function type has no meaning; ignored
1>        C:\Program Files\boost\boost_1_38_0\boost/bind.hpp(1677) : see reference to class template instantiation 'boost::_bi::add_cref<Pm,I>' being compiled
1>        with
1>        [
1>            Pm=void (__thiscall cGridAnimator::* )(int),
1>            I=1
1>        ]
1>        .\mfm1.cpp(158) : see reference to class template instantiation 'boost::_bi::dm_result<Pm,A1>' being compiled
1>        with
1>        [
1>            Pm=void (__thiscall cGridAnimator::* )(int),
1>            A1=cGridAnimator *
1>        ]
1>C:\Program Files\boost\boost_1_38_0\boost/mem_fn.hpp(318) : warning C4180: qualifier applied to function type has no meaning; ignored
1>        C:\Program Files\boost\boost_1_38_0\boost/bind/bind_template.hpp(344) : see reference to class template instantiation 'boost::_mfi::dm<R,T>' being compiled
1>        with
1>        [
1>            R=void (int),
1>            T=cGridAnimator
1>        ]
1>Project : error PRJ0002 : Error result 1 returned from 'C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe'.

Ответы [ 3 ]

3 голосов
/ 21 августа 2009

Измените код на:

pThread[0] = new boost::thread(boost::bind(&cGridAnimator::DoJob, this, 0 ));  

Этот код дает потоку функцию void (void) вместо функции void (int) и дополнительного аргумента.

2 голосов
/ 21 августа 2009

Нет однозначного ответа; по сути, ICE всегда является хорошей причиной для обращения к поставщику компилятора.

Чтобы найти реальную причину, это поможет найти минимальную программу, которая все еще показывает сбой. Это означает удаление как можно большего количества кода, удаление как можно большего количества зависимостей и т. Д. И т. Д. Для одного ICE я однажды имел успех при запуске нового проекта и просто написал пятьдесят строк кода, в которых я подозревал проблему .

В прошлом мне помогли следующие обходные пути:

  1. снизить уровень оптимизации
    • особенно генерация временного кода ссылки кажется немного шаткой
  2. изменить порядок включения файлов
    • только разумно, если вы знаете ревизию источника, когда он перестал работать, поэтому вы можете сосредоточиться на изменениях там
  3. переключиться на другую версию Boost
    • Автор библиотеки надстроек, возможно, активировал обходной путь, или просто изменился код, чтобы больше не вызывать ICE.
0 голосов
/ 08 мая 2013

Обратите внимание, что если вы используете boost :: bind, а тип параметра неправильный, Visual Studio не будет напоминать вам об этой ошибке, но сообщит об ошибке с PRJ0002 и cl.exe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...