C 併發程式設計 設計執行緒安全的佇列 鍊錶 查詢表

2021-10-07 17:05:43 字數 4123 閱讀 4802

一般想法都會是用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的指標,還有前向指標。為了從列表中刪除乙個節點,其兩邊節點的指標都需要更新。當其中一邊更新完成時,不變數就被破壞了,直到另一邊也完成更新 在兩邊都完成...