C

时间:2016-10-06 09:19:49

标签: c sockets callback android-source

我在C" DoSomething1()"," DoSomething2()",...," DoSomethingN()中有多种方法"对某些数据的请求。可以同时调用这些方法。 数据驻留在不同的进程中,当前进程与其他进程之间的通信是使用套接字完成的。

如何创建同步回调" GetSpecialValue()"使用前面提到的套接字请求数据然后,当套接字回复时,将答案返回给特定的" DoSomethingN()"请求了吗?

请记住,我有很多方法可以使用单个套接字并传递请求,它们的回复应该返回到发起调用的特定方法。这些方法在不同的线程中工作。

int DoSomethingN(int id) {
    int returnValue = GetSpecialValue(id);
    return returnValue;
}

int GetSpecialValue(int id) {
    SendToProcessViaSocket(id);
    int returnValue = ReceiveSocketAnswer();
    return returnValue;
}

我知道有些人使用libevent进行回调,但我不认为您可以在调用事件时返回新参数。此外,它是async并且不是 AOSP构建的一部分..

谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案是在传递请求后锁定线程 然后,将锁添加到处理请求套接字的线程可见的向量。

std::tuple<int, pthread_mutex_t *, pthread_cond_t *, bool *> callbackData;
pthread_mutex_t *reqMutexLock = (pthread_mutex_t *)malloc(sizeof(*reqMutexLock));
pthread_cond_t *reqCondition = (pthread_cond_t *)malloc(sizeof(*reqCondition));
bool *state = (bool *)malloc(sizeof(*state));

(*reqMutexLock) = PTHREAD_MUTEX_INITIALIZER;
(*reqCondition) = PTHREAD_COND_INITIALIZER;
(*state) = false;

int callbackId = rand();

callbackData = std::make_tuple(callbackId, reqMutexLock, reqCondition, state);

pthread_mutex_lock(reqMutexLock);
SendRequest(callbackId, id);
while (!(*state)) {
    pthread_cond_wait(reqCondition, reqMutexLock);
}
pthread_mutex_unlock(reqMutexLock);
pthread_mutex_destroy(reqMutexLock);
free(reqMutexLock);
free(reqCondition);
...

当响应从套接字返回时, 响应将保存在响应向量中,锁定从向量中获取并释放。

...
response = ReceiveResponse();
responsesList.push_back(response);

...
reqMutexLock = std::get<1>(callbackDataList[foundIndex]);
reqCondition = std::get<2>(callbackDataList[foundIndex]);
state = std::get<3>(callbackDataList[foundIndex]);

pthread_mutex_lock(reqMutexLock);
(*state) = true;
pthread_cond_broadcast(reqCondition);
pthread_mutex_unlock(reqMutexLock);
...

释放锁定后,线程将继续并询问结果,该结果将从向量中返回。

...
return GetResponse(callbackId);