2012-05-24 3 views
0

это следующий шаг после этой темы: Modifying data in threadsАтомных типов и нити

class Nginx_sender 
{ 
    private: 
     std::atomic_int data; 
     boost::mutex mMutex; 
    void SendMessage(const std::string &msg) 
    { 
     mMutex.lock(); 
     data++; 
     mMutex.unlock(); 

     std::cout << "DATA: " << data << std::endl; 
    } 

    void NewThreadFunction() 
    { 
     while(true) { 
     mMutex.lock(); 
     std::cout << data; 
     mMutex.unlock(); 

     boost::this_thread::sleep(boost::posix_time::milliseconds(200)); 
     } 
    } 
}; 
int main() 
{ 
    Nginx_sender *NginxSenderHandle; 
    boost::thread sender(boost::bind(&Nginx_sender::NewThreadFunction, &NginxSenderHandle)); 
    // ... 
} 

В NewThreadFunction данных всегда 0 и в SendMessage он изменяется каждый раз, когда я называю SendMessage. Итак, как правильно работать с этим?

+0

Вы передаете адрес локальной переменной другому потоку, что является плохой идеей. В вашем случае это может сработать, потому что 'main' не возвращается, пока программа (и другой поток) не выйдет, но вы должны рассмотреть динамическое распределение для этого. –

ответ

1

Извлеките & из второго аргумента для привязки. У вас уже есть указатель на объект, и это то, что вы, вероятно, пытаетесь использовать. Во-вторых, указатель неинициализирован, что также может быть источником вашей проблемы. Обратите внимание: вам нужно будет убедиться, что объект остается действительным до тех пор, пока поток не будет соединен.

int main() 
{ 
    Nginx_sender *NginxSenderHandle = new Nginx_sender ; 
    boost::thread sender(boost::bind(&Nginx_sender::NewThreadFunction, NginxSenderHandle)); 
    // ... 
} 
2

Зачем вы передаете Nginx_sender ** (двойной указатель) на boost::bind? Это кажется неправильным и объясняет, почему ваш поток работает на второй копии объекта, чем основной поток.

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