如何將非同步呼叫轉換成同步呼叫
如果是體位2的非同步,很簡單,反覆查詢直到OK即可,兩次查詢間sleep。一般sleep時間設定為可以容忍的延遲時間。sleep時間短,則響應快(但即使你設定為sleep(0)也不可能每秒抽插超過1000次),但是cpu負載也比較大。注意如果不sleep,cpu將跑滿,這可能導致工作執行緒更慢完成(想象下你讓某人做件事,然後在一旁不停地問好了沒好了沒),最好不要這麼做。
===============程式碼的分割線====================
#include <iostream>
#include <string>
#include <queue>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <windows.h> // 只用到Sleep函式
using namespace std;
string somefuncMaybeBlock(){
string str;
getline(cin, str);
return str; // 如果是未採用隱式資料共享的std實現,這句話比較低效,但無妨,此例只是演示體位變換
}
class CheckMeLaterCaller{
public:
class Result{
public:
Result()
: ready_flag(false){
}
void setData(const string& res){
boost::mutex::scoped_lock lock(mtx);
result = res;
ready_flag = true;
}
string getData(){
boost::mutex::scoped_lock lock(mtx);
return result;
}
bool ready(){
boost::mutex::scoped_lock lock(mtx);
return ready_flag;
}
private:
string result;
bool ready_flag;
boost::mutex mtx;
};
void call(Result* result){
boost::mutex::scoped_lock(mtx);
queue.push(result);
if (queue.size() == 1){
cond.notify_all();
}