2016-10-06 6 views
1

いくつかのデータを要求するC "DoSomething1()"、 "DoSomething2()"、...、 "DoSomethingN()"に複数のメソッドがあります。これらのメソッドは同時に呼び出すことができます。 データは別のプロセスに存在し、現在のプロセスと他のプロセスとの通信はソケットを使用して行われます。Cの同期コールバック

上記のソケットを使用してデータを要求する同期コールバック "GetSpecialValue()"を作成し、ソケットが応答すると、その応答を要求した特定の "DoSomethingN()"に戻す方法を教えてください。

私は、1つのソケットで動作し、呼び出しを開始した特定のメソッドに応答が返されるように要求する多くのメソッドがあることに注意してください。それらのメソッドは異なるスレッドで動作します。

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

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

私は何人かの人々がコールバックにlibeventを使用することを知っているが、私は、イベントが呼び出されたときに新しいパラメータを返すことができるとは思いません。また、非同期であり、AOSPビルド ..

ありがとう!

+1

デフォルトで同期がとれていますが、何が必要なのですか?単純に要求を送信し、応答を受け取ります... – immibis

+0

スレッドロックを使用する必要があると聞こえますが、関数GetSpecialValue()によって取り出され、DoSomethingN()関数によって解放されるロックを作成できます。 – Alex

答えて

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); 
関連する問題