2015-08-18 7 views
-3

У меня есть вопрос: может ли человек создать новый thread tt под номером thread t? Этот новый thread tt должен использовать функцию-член memberfunction() в class A. thread t вызывает независимую функцию D() из class A. Функция D() вызывает memberfunction().Можно ли создать новую нить под потоком?

Это мой грубый код:

class A 
{ 
public: 
    int memberfunction(); 
}; 

void D() 
{ 
    A class; 
    boost::function<int()> f; 
    f = boost::bind(&A::memberfunction, &class); 
    boost::thread tt(f); 
} 

void main() 
{ 
    ... 
    boost::thread t(D); 
} 

boost::thread tt(f); шаг не в состоянии создать новую тему. Есть ли у вас какие-либо идеи? Или любой другой метод?

+2

Просьба полностью описать ожидаемое поведение и фактическое поведение. Предоставьте полный, самостоятельный пример, который просто компилируется. Вряд ли вы просто начинаете tt и ничего не делаете с этим. – gd1

+1

Threading не связан с доступностью видимости. – user2864740

+0

@ gd1 по причине тайны я не могу предоставить полный пример. При компиляции ошибок нет. В отладочном окне VS2010 я увидел, что поток tt не создается, пока поток t успешно создан. – rayallen

ответ

2

Да, это возможно.

Прежде всего, предоставьте минимальный компилируемый пример в следующий раз, например.

#include <functional> 
#include <thread> 

class A 
{ 
    public: 
     int memberfunction() { return 0; } 
}; 

void D() 
{ 
    A x; 
    std::function<int()> f; 
    f = std::bind(&A::memberfunction, &x); 
    std::thread tt(f); 
    tt.join(); 
} 

int main() 
{ 
    std::thread t(D); 
    t.join(); 
    return 0; 
} 

(Компиляция с г ++ -std = C++ 11 -pthread file.cpp)

Обратите внимание, что я заменил boost::thread с std::thread и boost::bind с std::bind и что я предполагаю, что они одинаковы ,

Я также добавил join звонков. Деструктор std::thread выдает исключение, если ваш поток по-прежнему joinable(). Это так, если вы не звонили join или detach.

Не имеет отношения, но вы должны избегать использования ключевых слов для чего-либо еще, т. Е. Не назовите свои переменные class.

+0

Спасибо за ответ. Создается нить tt. Я работаю над большим проектом в компании, и я не могу предоставить исходный код для этого, я переписываю его. Вы правы, в следующий раз я приведу пример, который можно скомпилировать. – rayallen

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