一般想法都會是用std::mutex鎖住整個資料結構,如下面**所示。當然了,這種是一種實現傳送,但是不是最好的方式,不能實現最大併發。
github示例**
#include #include #include #include #include /*
use c++ 11
*/templateclass threadsafequeue
threadsafequeue(threadsafequeue const& other)
void push(t new_value)
void wait_and_pop(t& value)
);value = data_queue.front();
data_queue.pop();
}std::shared_ptrwait_and_pop()
);std::shared_ptrres(std::make_shared(data_queue.front()));
data_queue.pop();
return res;
}bool try_pop(t& value)
std::shared_ptrtry_pop()
bool empty() const
};//test
void preparedata(threadsafequeue& queue)
}void processdata(threadsafequeue& queue)
}int main()
在乙個資料結構中,各個部分都有乙個std::mutex例項。,當某個執行緒需要操作其中的部分時,利用std::mutex將其鎖住,這樣,如果其他執行緒訪問另外乙個部分時,不需要等待,這樣就能最大程度實現併發,但實現起來相對麻煩一些,容易發生死鎖等。
github示例**
#include #include #include #include #include /*
use c++ 11
*/templateclass threadsafequeue
; std::mutex head_mutex;
std::unique_ptrhead;
std::mutex tail_mutex;
node* tail;
std::condition_variable data_cond;
private:
node* get_tail()
std::unique_ptrpop_head()
std::unique_lockwait_for_data()
);return head_lock;
}std::unique_ptrwait_pop_head()
std::unique_ptrwait_pop_head(t& value)
std::unique_ptrtry_pop_head()
return pop_head();
}std::unique_ptrtry_pop_head(t& value)
value = std::move(*head->data);
return pop_head();
}public:
threadsafequeue() :head(new node), tail(head.get()){}
threadsafequeue(const threadsafequeue& other) = delete;
threadsafequeue& operator=(const threadsafequeue& other) = delete;
std::shared_ptrtry_pop()
bool try_pop(t& value)
std::shared_ptrwait_and_pop()
void wait_and_pop(t& value)
void push(t new_value)
data_cond.notify_one();
}void empty()
};//test
void preparedata(threadsafequeue& queue)
}void processdata(threadsafequeue& queue)
}int main()
github示例**
#include #include #include templateclass threadsafelist
node(t const& value) : data(std::make_shared(value))
{}};
node head;
public:
threadsafelist()
{}~threadsafelist());}
threadsafelist(threadsafelist const& other) = delete;
threadsafelist& operator=(threadsafelist const& other) = delete;
void push_front(t const& value)
templatevoid for_each(function f)
}templatestd::shared_ptrfind_first_if(predicate p)
current = next;
lk = std::move(next_lk);
}return std::shared_ptr();
}templatevoid remove_if(predicate p)
else}}
};int main()
); std::cout << std::endl;
std::shared_ptrptr=list.find_first_if((const int& item) );
if (ptr.get()!=nullptr)
}
github示例**
// threadsafelookuptable.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
//#include #include #include#include #include #include #include #include #include //#include template>
class threadsafelookuptable
); }
public:
value value_for(key const& key, value const& default_value) const
else}}
};std::vector> buckets;
hash hasher;
bucket_type& get_bucket(key const& key) const
public:
typedef key key_type;
typedef hash hash_type;
threadsafelookuptable(
unsigned num_buckets = 19, hash const& hasher_ = hash()) :
buckets(num_buckets), hasher(hasher_)
}threadsafelookuptable(threadsafelookuptable const& other) = delete;
threadsafelookuptable& operator=(
threadsafelookuptable const& other) = delete;
value value_for(key const& key,value const& default_value = value()) const
std::mapget_map() const
std::mapres;
for (unsigned i = 0; i < buckets.size(); ++i)
}return res;
}};int main()
}
《併發程式設計》 15 執行緒安全的HashMap
眾所周知,hashmap是執行緒不安全的。但是如果需要乙個執行緒按鈕的hashmap我們需要怎麼做的。其中乙個可行的辦法就是collections.synchronizedmap。如下 就是執行緒安全的hashmap public static map m collections.synchroni...
C 的執行緒安全的佇列
1 這個實現要求構建工具支援c 11的atomic mutex condition veriable功能。這是c 11的基礎特性,一般2011年以後的c 編譯器都能支援。例如,visual studio 2012以上。2 這個類的實現中有兩處使用了unique lock而不是lock guard,這...
多執行緒程式設計 執行緒安全的鍊錶
接下來寫乙個執行緒安全的鍊錶 雙鏈表中每個節點都有乙個指標指向列表中下乙個節點,還有乙個指標指向前乙個節點。其中不變數就是節點a中指向 下乙個 節點b的指標,還有前向指標。為了從列表中刪除乙個節點,其兩邊節點的指標都需要更新。當其中一邊更新完成時,不變數就被破壞了,直到另一邊也完成更新 在兩邊都完成...