Xin chào mọi người, em mới học về thread, em có một chương trình thế này:
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <memory>
#include <vector>
#include <functional>
#include <algorithm>
#include <chrono>
template<typename T>
class safe_queue
{
private:
std::queue<T> m_queue;
mutable std::mutex m_mutex;
std::condition_variable m_cond_variable;
public:
safe_queue()
{
}
safe_queue(const safe_queue& other)
{
std::lock_guard<std::mutex> lk(other.m_mutex);
m_queue = other.m_queue;
}
void push(T value)
{
std::lock_guard<std::mutex> lk(m_mutex);
m_queue.push(value);
m_cond_variable.notify_one();
}
void wait_and_pop(T& value)
{
std::unique_lock<std::mutex> lk(m_mutex);
m_cond_variable.wait(lk, [this] { return !m_queue.empty(); });
value = m_queue.front();
m_queue.pop();
}
std::shared_ptr<T> wait_and_pop()
{
std::unique_lock<std::mutex> lk(m_mutex);
m_cond_variable.wait(lk, [this] { return !m_queue.empty(); });
std::shared_ptr<T> value = std::make_shared<T>(m_queue.front());
m_queue.pop();
return value;
}
bool try_pop(T& value)
{
std::lock_guard<std::mutex> lk(m_mutex);
if (m_queue.empty())
return false;
value = m_queue.front();
m_queue.pop();
return true;
}
// std::shared_ptr<T> try_pop()
// {
// std::lock_guard<std::mutex> lk(m_mutex);
// if (m_queue.empty())
// return NULL;
// std::shared_ptr<T> value = std::make_shared<T>(m_queue.front());
// m_queue.pop();
// return value;
// }
bool empty() const
{
std::lock_guard<std::mutex> lk(m_mutex);
return m_queue.empty();
}
};
void func_try_pop()
{
auto start = std::chrono::high_resolution_clock::now();
const unsigned int hardware_concurency = std::thread::hardware_concurrency();
std::vector<std::thread> threads(hardware_concurency * 2);
std::vector<int> vals(hardware_concurency);
safe_queue<int> sq_instance = safe_queue<int>();
for (int i = 0; i < hardware_concurency; ++ i)
{
threads[i] = std::thread(&safe_queue<int>::push, std::ref(sq_instance), i);
threads[i + hardware_concurency] = std::thread(&safe_queue<int>::try_pop, std::ref(sq_instance), std::ref(vals[i]));
}
std::for_each(threads.begin(), threads.end(), std::mem_fn(&std::thread::join));
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> ms_double = end - start;
std::cout << "execution try_pop: " << ms_double.count() << "\n";
}
int main()
{
func_try_pop();
return 0;
}
Em đã biết cách để gọi hàm trong class cho thread, nhưng khi em mở code block try_pop đang bị comment (overloading), thì chương trình bị lỗi.
Nó thông báo lỗi thế này ạ:
Em muốn hỏi trong trường hợp sử dụng hàm try_pop như trên thì làm sao để gọi hàm trong thread để lấy hàm thứ nhất ạ, em xin cảm ơn mọi người.