使用libev和pthread的异步hiredis,我做错了什么?

使用libev和pthread的异步hiredis,我做错了什么?,redis,pthreads,libev,hiredis,Redis,Pthreads,Libev,Hiredis,我正在为一个小型单色显示器编写GUI,我想每秒更新屏幕上的数据 数据存储在redis数据库中,我正在尝试使用pthread、libev和异步hiredis调用进行协调 我的计划是让一个线程每秒从数据库中提取新数据,并存储一个本地副本以供快速访问 另一个更新屏幕的线程将随意访问该数据,而无需等待数据库访问 第一个问题,我的方法正确吗 第二个问题,为什么我每秒都无法轮询数据库?我想我可以切换到同步方法并让它工作,但这是正确的方法吗 以下是相关代码: int main(int argc, char *

我正在为一个小型单色显示器编写GUI,我想每秒更新屏幕上的数据

数据存储在redis数据库中,我正在尝试使用pthread、libev和异步hiredis调用进行协调

我的计划是让一个线程每秒从数据库中提取新数据,并存储一个本地副本以供快速访问

另一个更新屏幕的线程将随意访问该数据,而无需等待数据库访问

第一个问题,我的方法正确吗

第二个问题,为什么我每秒都无法轮询数据库?我想我可以切换到同步方法并让它工作,但这是正确的方法吗

以下是相关代码:

int main(int argc, char *argv[])
{
  pthread_t dataThread;
  pthread_t guiThread;

  pthread_create(&dataThread, NULL,  dataHandler, NULL);
  pthread_create(&guiThread, NULL, guiHandler, NULL);

  while (true)
  {
    sleep(10);
  }

  return 0;
}
在下面的例子中,如果我移动
ev_循环(ev_DEFAULT_0)在redisAsync命令后的while循环中,我的回调被第一个循环调用,但不再调用。就这样,我的回拨从未被调用过

void* dataHandler(void *ptr)
{ 
  m_ctx = redisAsyncConnect("127.0.0.1", 6379); 
  if (m_ctx->err) {

    printf("Redis async connection failed. Error: %s\n", m_ctx->errstr);
    exit(-1);
  }

  redisLibevAttach(EV_DEFAULT_ m_ctx);
  redisAsyncSetConnectCallback(m_ctx,connectCallback);
  redisAsyncSetDisconnectCallback(m_ctx,disconnectCallback);
  ev_loop(EV_DEFAULT_  0);

  while (true)
  {
    int result;

    result = redisAsyncCommand(m_ctx, updateCallback, (char*)"data1", "HGET data1 data");
    printf("result: %d\n", result);
    result = redisAsyncCommand(m_ctx, updateCallback, (char*)"data2", "HGET data2 data");
    printf("result: %d\n", result);
    //ev_loop(EV_DEFAULT_  0); <- this will work one time
  }

  redisAsyncDisconnect(m_ctx);  
  return 0;
}

void updateCallback(redisAsyncContext *c, void *r, void *privdata)
{
  redisReply *reply = (redisReply*)r;
  if (reply == NULL) return;

  printf("%s: %s\n", (char*)privdata, reply->str);
}

void* guiHandler(void *ptr)
{
  while (true)
  {
    // Update the GUI accordingly
    sleep(1);
  }
}
void*dataHandler(void*ptr)
{ 
m_ctx=redisAsyncConnect(“127.0.0.1”,6379);
如果(m_ctx->错误){
printf(“Redis异步连接失败。错误:%s\n”,m\u ctx->errstr);
出口(-1);
}
redisLibevAttach(EV_DEFAULT_uctx);
redisAsyncSetConnectCallback(m_ctx,connectCallback);
redisAsyncSetDisconnectCallback(m_ctx,disconnectCallback);
ev_循环(ev_默认值为0);
while(true)
{
int结果;
结果=redisyncCommand(m_ctx,updateCallback,(char*)“data1”,“HGET data1 data”);
printf(“结果:%d\n”,结果);
结果=redisyncCommand(m_ctx,updateCallback,(char*)“data2”,“HGET data2 data”);
printf(“结果:%d\n”,结果);
//ev_循环(ev_默认值为0);str);
}
void*guiHandler(void*ptr)
{
while(true)
{
//相应地更新GUI
睡眠(1);
}
}

首先,我建议您在使用libev之前先阅读该手册:

现在来看看你的代码, ev_循环功能将启动一个事件循环,您只能通过2个HGET操作“馈送”它。 为了添加更多操作,您需要为事件循环添加附加事件,但我不确定这是否适合您的情况。
如果线程的目的只是每X秒获取一次db,那么为什么要使用异步方法呢?我只需要使用hiredis sync API

谢谢您的响应。是的,我切换到使用同步API。我想尝试使用异步API的原因是允许我在其他工作中使用同一线程,但这不是很简单奥沃德。