2017-01-05 6 views
0

Мне было интересно, как реализовать Redis NOSQL-вызовы в код библиотеки C++ Std Threading из C++ параллелизма в книге действий.Threading Redis connection in C++

Я использую GitHub Repo https://github.com/subjam/concurrency-in-action

исходный файл
https://github.com/subjam/concurrency-in-action/blob/master/ch7/stack.cpp

мне было интересно, если я разместил свой код подключения Redis NoSQL в функции толчок() имеет смысл.

Я также использую Redox, который является C++-оболочкой, которая включает библиотеку Hiredis C.

https://github.com/hmartiro/redox

Я использую абонентский NoSQL образец, который будет включен в функции Резьбонарезного толчка(). Это приведет к тому, что соединение и запрос будут выполняться каждый раз, когда будет нажатие, но семафор/мьютекс не потребуется (я полагаю). На строке 145 push() в stack.cpp можно ли переписать функцию push как?

void push(stack<int>* s) 
{ 
    Redox rdx; Subscriber sub; 
    if(!rdx.connect() || !sub.connect()) return; 

    sub.subscribe("hello", [](const string& topic, const string& msg) { 
      …parse msg fields into data structure … 
    s->push(data); 

    }); 
} 

Или должен ли я сделать следующий код соединения один раз перед выполнением функции push()?

Redox rdx; Subscriber sub; 
if(!rdx.connect() || !sub.connect()) return ; 

там будет ли это резьб конфликт, если я держу код подключения Redis вне push()
Или есть более оптимальный способ кодирования это в stack.cpp? Thanks

ответ

1

Ваша функция push не будет работать, как вы ожидали. Подписка будет уничтожена сразу после звонка по телефону sub.subscribe():

void push(stack<int>* s) { 
    // No need for Redox object here. 
    Subscriber sub; 
    if (!sub.connect()) return; 

    sub.subscribe("hello", [](const std::string& topic, const std::string& msg) { 
     // parse msg fields into data structure 
     s->push(data); 
    }); 
    // sub object will be destroyed here, 
    // subscription to the "hello" topic will be interrupted. 
    // Additionally, some resources might leak, 
    // since sub.disconnect() was not called. 
}