Основываясь на комментариях, я думаю, что нашел ответ. Я использовал предложение @Sam Varshavchik и определяю функцию потока как:
void write_image_thread(std::valarray<T> &data, Archon::Information &info, FITS_file<T> *obj) {
const std::lock_guard<std::mutex> lock(obj->fits_mutex); // access private members!
obj->writing_file = true; // access private members!
try {
obj->pFits->pHDU().addKey("EXPOSURE", fpixel,"Total Exposure Time");
// and more stuff...
}
catch (CCfits::FitsError& error){
// handle faults
}
// all done
obj->writing_file = false;
}
, затем вызываю ее с помощью:
std::thread([&](){this->write_image_thread(std::ref(array), std::ref(info), this);}).detach();
, и это, похоже, работает! Так что я думаю это ответ (я собираюсь попытаться применить его еще немного, прежде чем пометить это как ответ, чтобы быть в безопасности).
Не уверен, что это хорошая практика для задавать дополнительные вопросы, но они связаны ...
1) действительно ли нужны функции std :: ref ()? Я добавил их, чтобы они были явными, но, похоже, они работают без них.
2) Я должен признать, что ДЕЙСТВИТЕЛЬНО не понимаю лямбда-выражение, которое я использую; Я обнаружил это в другом вопросе переполнения стека ( C ++ 11 Инициализация потока с ошибкой компиляции функций-членов - в комментарии к исходному вопросу). Я пробовал разные способы заставить его работать без лямбды, но не могу заставить его скомпилироваться иначе.
Другими словами, это:
std::thread(&FITS_file<T>::write_image_thread, std::ref(array), std::ref(info), this).detach();
не работает; это выдает следующую ошибку:
In file included from /usr/include/c++/4.8.2/mutex:42:0,
from /home/user/archon-interface/include/common.h:13,
from /home/user/archon-interface/src/archon.cpp:9:
/usr/include/c++/4.8.2/functional: In instantiation of ‘struct std::_Bind_simple<std::_Mem_fn<void (FITS_file<float>::*)(std::valarray<float>&, Archon::Information&, FITS_file<float>*)>(std::reference_wrapper<std::valarray<float> >, std::reference_wrapper<Archon::Information>, FITS_file<float>*)>’:
/usr/include/c++/4.8.2/thread:137:47: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (FITS_file<float>::*)(std::valarray<float>&, Archon::Information&, FITS_file<float>*); _Args = {std::reference_wrapper<std::valarray<float> >, std::reference_wrapper<Archon::Information>, FITS_file<float>* const}]’
/home/user/archon-interface/include/fits.h:137:94: required from ‘long int FITS_file<T>::write_image(T*, Archon::Information&) [with T = float]’
/home/user/archon-interface/src/archon.cpp:1697:52: required from here
/usr/include/c++/4.8.2/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void (FITS_file<float>::*)(std::valarray<float>&, Archon::Information&, FITS_file<float>*)>(std::reference_wrapper<std::valarray<float> >, std::reference_wrapper<Archon::Information>, FITS_file<float>*)>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^
/usr/include/c++/4.8.2/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void (FITS_file<float>::*)(std::valarray<float>&, Archon::Information&, FITS_file<float>*)>(std::reference_wrapper<std::valarray<float> >, std::reference_wrapper<Archon::Information>, FITS_file<float>*)>’
_M_invoke(_Index_tuple<_Indices...>)
^
make[2]: *** [CMakeFiles/archonserver.dir/src/archon.cpp.o] Error 1
make[1]: *** [CMakeFiles/archonserver.dir/all] Error 2
make: *** [all] Error 2
Но, как я уже сказал, если я использую лямбду, то это работает! Так что, может быть, я должен быть счастлив этим.