使用cpp_redis pub / sub和条件变量的问题

时间:2018-06-10 10:01:37

标签: c++ redis

我使用cpp_redis创建了两个应用程序;一个使用发布和另一个订阅者。我已经将redis客户端包装到了一个类中,因为我希望能够在将来更改通信。我遇到的问题是我的类的回调在使用条件变量时不起作用。使用redis-cli监视器,我可以看到事件正在发布但订阅者应用程序没有收到。如果我更改代码以使用原子变量并替换主循环中的条件变量并添加 while(!atomic_var)以等待; ,则订阅回调有效。

class EventComms : public IEventComms
{
public:
    EventComms(cpp_redis::client &client, string channel);
    ~EventComms();
    void Publish(string uid);
    void Subscribe(TSubCallbackFunction callback);
private:
    string comms_channel;
    cpp_redis::client &redis_client;
    cpp_redis::subscriber sub;
};

void EventComms::Subscribe(TSubCallbackFunction callback) {
    sub.connect();
    sub.subscribe(comms_channel, 
            [&](const string& channel, const string& message){
        if (comms_channel == channel) {
            callback(message);
        }
    });
    sub.commit();
}

我的发布代码。

int main(int argc, char* argv[]) {
    cpp_redis::client client;
    client.connect();
    EventComms *comms = new EventComms(client, "/TEST");
    char c;
    while (1) {
        cout << "Waiting for commands " << endl;
        c = getchar();
        switch (c) {
            case 'p':
            {
                string uuid = generateUuidString();
                comms->Publish(uuid);
                break;
            }
            default:
            break;
        }
    }
    return 0;
}

我的订阅代码。

int main(int argc, char *argv[]) {
    std::condition_variable cv;
    cpp_redis::client client;
    client.connect();
    EventComms comms(client, "/TEST");
        comms.Subscribe([&](string message) {
        event_id = message;
        cout << "rx message: " << message << endl;
        waitcv.notify_all();
    }
    );;
    cout << "started software" << endl;
    while(1) {
        std::mutex mutex;
        std::unique_lock<std::mutex> lock(mutex);
        waitcv.wait(lock);
        cout << "Received data: " << event_id << endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

不确定此处是否不完整,但是 https://cylix.github.io/cpp_redis/html/classcpp__redis_1_1subscriber.html#ab7feafca57399394e3a1a0d6daf52770

他们说: cpp_redis :: subscriber用于与Redis服务器进行PUB / SUB通信。请不要使用cpp_redis :: client以以下方式订阅一些Redis频道:

  • 行为未定义
  • cpp_redis :: client并非用于此目的

希望这会有所帮助。 (我本人仍在与PUB / SUB斗争,所以我没有解决方案)