2013-07-31 2 views
0

У меня есть класс, который содержит функции, которые нужно запускать как потоки. Правильный способ сделать это (сформировать то, что я понимаю) означает, что эти функции объявлены как статические. Чтобы использовать методы из этого класса, мне нужен a, чтобы иметь экземпляр для этого класса, поэтому я создаю статическую переменную, инициализированную self в конструкторе. Каковы последствия эффективности и логики программ?Каковы последствия наличия статического указателя на это

class Foo 
{ 
    private: Foo* this_instance; 
    Foo() 
    { 
     this_instance=this; 
    } 

    void FooBar() 
    { 
    ... 
    } 

    static void* Bar() 
    { 
    if (this_instance==NULL) return 1; //throws are not catched are they? 
    this_instance->FooBar(); 
    return 0; 
    } 
} 

Недействительный код, но чтобы уточнить мой вопрос.

Приложение действительно работает, и я проверил его с помощью helgrind/memcheck, и ошибки не связаны с проблемой. Я задаю этот вопрос, потому что все решения выглядят как обходные пути, в том числе и этот. Другие подобны тому, что упоминается врачом, другие используют вспомогательный статический метод.

Мне интересно, может ли мой подход привести к эпическим неудачам в какой-то момент времени, по какой-то причине неизвестным мне и очевидным для других более опытных программистов.

+2

Статическая переменная не является хорошим подходом - что делать, если вы одновременно используете несколько объектов этого класса? Другим подходом является передача 'this' в качестве параметра вашей точки ввода потока. – Nbr44

+1

Можем ли мы использовать C++ 11? – doctorlove

+0

@doctorlove Класс больше похож на сервер, который слушает некоторые события. Несмотря на то, что я не добавлял защиту от нескольких экземпляров (например, this_instance check in constructor), я использую его как один экземпляр. Компилятор на моей системе не использует C++ 11 (gcc 4.3.4), это компилятор по умолчанию на сервере, где будет развернуто приложение. – LucianMLI

ответ

0

Вам не нужны функции для статичности, чтобы использовать их в потоках. Вы можете связать функции экземпляра или передать этот указатель или использовать C++ 11 с лямбдой.
Если вы используете необработанные потоки, вам придется поймать исключения в потоке - они не будут распространяться на код, который запустил поток.
В C++ 11 вы можете распространять исключения, используя current_exception и rethrow_exception. См here


EDIT

Если у вас есть статический указатель для каждого типа, вы можете иметь только один экземпляр этого, но ваш код не делает ничего, чтобы предотвратить статический указатель сбрасывается. Зачем беспокоиться о том, чтобы иметь экземпляр класса в первую очередь - наверняка просто передайте параметры? Я думаю, что чище иметь свободные функции для выполнения работы. Если вы считаете, что это не стоит усилий, это ваш код. Что ваши коллеги думают о вашем дизайне?

+0

Метод статического метода - это решение, которое я получил для чтения здесь, в stackoverflow. Обработка исключений здесь не проблема, у меня есть попытка try-catch потока и поток монитора (joinable), который получает результаты от других потоков (отсоединенных), когда они заканчиваются. C++ 11 недоступен на целевой машине. – LucianMLI

+0

@LucianMLI затем использовать boost bind или рассмотреть возможность передачи этого указателя в качестве параметра – doctorlove

+0

Вы все еще не сказали, каковы недостатки/опасности использования этого подхода, чтобы изменения стоили того времени. – LucianMLI

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