2011-12-16 2 views
1
class c 
{ 
public: 
    int id; 
    boost::thread_group thd; 
    c(int id) : id(id) {} 
    void operator()() 
    { 
     thd.create_thread(c(1)); 
     cout << id << endl; 
    } 


}; 

Я создал класс c. Каждый объект класса создает потоки для обработки работы. Однако я получаю это странное сообщение, когда я компилирую этоC++ Boost, используя thread_group в классе

: ошибка C2248: «повышение :: thread_group :: thread_group»: не может получить доступ к закрытому члену, объявленный в классе «подталкивание :: thread_group»

Кроме того, просто предположим, есть нет проблем с рекурсивным вызовом.

ответ

3

Проблема в том, что способ, которым настроен ваш код, заключается в передаче копии вашего объекта для создания нового потока.

Вы получаете ошибку, поскольку конструктор копирования boost :: thread_group является закрытым, поэтому вы не можете копировать объект класса c. Вы не можете скопировать объект класса c, потому что конструктор копии по умолчанию пытается скопировать всех членов и не может скопировать boost :: thread_group. Таким образом, ошибка компилятора.

Классическим решением для этого было бы написать собственный конструктор копий, который не пытается копировать boost :: thread_group (если вы действительно хотите одну уникальную цепочку thread_group для каждого вызова) или сохранить boost :: thread_group в указателе который может быть скопирован (который будет разделять группу, и, вероятно, вы хотите).

Примечание:

Это, как правило, проще не написать свой собственный оператор(), а просто передать повышение :: функции вместо. Это будет сделано с

#include <boost/thread.hpp> 
#include <iostream> 
using namespace std; 
class c 
{ 
public: 
    boost::thread_group thd; 

    void myFunc(int id) 
    { 
     boost::function<void(void)> fun = boost::bind(&c::myFunc,this,1); 
     thd.create_thread(fun); 
     cout << id << endl; 
    } 


}; 

Обратите внимание, что все, что в классе С совместно, и все, что передается по значению в вызове функции не используются совместно.

+0

но я должен создать объект класса, который имеет переменные и функции члена. Поэтому я не могу сделать поток как одну функцию. Есть ли способ создать объект класса, как я сделал выше? – Jaebum

+0

@LeeJae Как я уже упоминал в своем ответе, вы должны хранить boost :: thread_group в каком-то указателе. Я бы предложил shared_ptr. – Lalaland

+0

[Здесь] (http://ideone.com/rb8qx) - пример. – Lalaland

Смежные вопросы