Tôi muốn chuỗi của mình tắt hơn một cách duyên dáng vì vậy tôi đang cố gắng triển khai một cơ chế báo hiệu đơn giản. Tôi không nghĩ rằng tôi muốn có một chủ đề hoàn toàn hướng sự kiện vì vậy tôi có một nhân viên với một phương pháp để ngăn chặn nó graceully sử dụng một phần quan trọng Monitor
(tương đương với một C# lock
Tôi tin):Có thể đọc cờ boolean được chia sẻ mà không khóa nó khi một luồng khác có thể đặt nó (tối đa một lần) không?
DrawingThread.h
class DrawingThread {
bool stopRequested;
Runtime::Monitor CSMonitor;
CPInfo *pPInfo;
//More..
}
DrawingThread.cpp
void DrawingThread::Run() {
if (!stopRequested)
//Time consuming call#1
if (!stopRequested) {
CSMonitor.Enter();
pPInfo = new CPInfo(/**/);
//Not time consuming but pPInfo must either be null or constructed.
CSMonitor.Exit();
}
if (!stopRequested) {
pPInfo->foobar(/**/);//Time consuming and can be signalled
}
if (!stopRequested) {
//One more optional but time consuming call.
}
}
void DrawingThread::RequestStop() {
CSMonitor.Enter();
stopRequested = true;
if (pPInfo) pPInfo->RequestStop();
CSMonitor.Exit();
}
tôi hiểu (ít nhất là trong Windows) Monitor
/lock
s là đắt đồng bộ hóa thread nhất nguyên thủy nhưng tôi đang quan tâm để tránh lạm dụng. Tôi có nên gói từng đọc của cờ boolean này không? Nó được khởi tạo thành false và chỉ được đặt một lần thành true khi dừng được yêu cầu (nếu nó được yêu cầu trước khi tác vụ hoàn tất).
Gia sư của tôi khuyên bảo vệ thậm chí bool
vì đọc/ghi có thể không phải là nguyên tử. Tôi nghĩ lá cờ này là ngoại lệ chứng tỏ quy tắc?
Làm theo lời khuyên của gia sư (có thể là đúng) - ngay cả khi họ không phải là những người đánh dấu công việc của bạn, vì vậy nếu họ nói cần thiết thì cần. – John3136
@ John3136 Lời khuyên của gia sư tôi là 10 tuổi, đây là công việc của tôi bây giờ. – John