Tôi có chuỗi tăng x hoạt động cùng một lúc. Một chuỗi nhà sản xuất điền vào hàng đợi được đồng bộ hóa với các nhiệm vụ tính toán. Chủ đề người tiêu dùng bật ra nhiệm vụ và tính toán chúng.Tắt chủ đề chính xác
Hình ảnh Nguồn: https://www.quantnet.com/threads/c-multithreading-in-boost.10028/
Người dùng có thể kết thúc programm trong quá trình này, vì vậy tôi cần phải tắt máy đề của tôi đúng. Cách tiếp cận hiện tại của tôi dường như không hoạt động, vì các ngoại lệ được ném ra. Đó là ý tưởng rằng trên hệ thống tắt tất cả các quá trình nên bị giết và ngừng nhiệm vụ hiện tại của họ không có vấn đề gì họ làm. Bạn có thể vui lòng chỉ cho tôi, làm thế nào bạn sẽ giết chủ đề?
Chủ đề initialisation:
for (int i = 0; i < numberOfThreads; i++)
{
std::thread* thread = new std::thread(&MyManager::worker, this);
mThreads.push_back(thread);
}
Chủ đề Tiêu hủy:
void MyManager::shutdown()
{
for (int i = 0; i < numberOfThreads; i++)
{
mThreads.at(i)->join();
delete mThreads.at(i);
}
mThreads.clear();
}
Worker:
void MyManager::worker()
{
while (true)
{
int current = waitingList.pop();
Object * p = objects.at(current);
p->calculateMesh(); //this task is internally locked by a mutex
try
{
boost::this_thread::interruption_point();
}
catch (const boost::thread_interrupted&)
{
// Thread interruption request received, break the loop
std::cout << "- Thread interrupted. Exiting thread." << std::endl;
break;
}
}
}
đồng bộ Queue:
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
template <typename T>
class ThreadSafeQueue
{
public:
T pop()
{
std::unique_lock<std::mutex> mlock(mutex_);
while (queue_.empty())
{
cond_.wait(mlock);
}
auto item = queue_.front();
queue_.pop();
return item;
}
void push(const T& item)
{
std::unique_lock<std::mutex> mlock(mutex_);
queue_.push(item);
mlock.unlock();
cond_.notify_one();
}
int sizeIndicator()
{
std::unique_lock<std::mutex> mlock(mutex_);
return queue_.size();
}
private:
bool isEmpty() {
std::unique_lock<std::mutex> mlock(mutex_);
return queue_.empty();
}
std::queue<T> queue_;
std::mutex mutex_;
std::condition_variable cond_;
};
Các ném gọi lỗi stack:
... std::_Mtx_lockX(_Mtx_internal_imp_t * * _Mtx) Line 68 C++
... std::_Mutex_base::lock() Line 42 C++
... std::unique_lock<std::mutex>::unique_lock<std::mutex>(std::mutex & _Mtx) Line 220 C++
... ThreadSafeQueue<int>::pop() Line 13 C++
... MyManager::worker() Zeile 178 C++
Hai điều: isEmpty không bị khóa và kích thước() có thể có một thực hiện đơn giản: sau khi mutex bị khóa bạn chỉ có thể trở lại queue_.size() (và mlock destructor phát hành các mutex) – marom
@marom cảm ơn, đã sửa mã của tôi. Lỗi vẫn còn đó. – Anthea
Hai điều: isEmpty và kích thước có thể không được công khai. Bất cứ điều gì họ báo cáo có thể không hợp lệ khi được người gọi đánh giá. Trừ khi chúng được sử dụng riêng tư, chúng sẽ bị loại bỏ. – stefan