- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对并发编程有点陌生,正在尝试了解使用 Monitor.Pulse 和 Monitor.Wait 的好处。
MSDN 的例子如下:
class MonitorSample
{
const int MAX_LOOP_TIME = 1000;
Queue m_smplQueue;
public MonitorSample()
{
m_smplQueue = new Queue();
}
public void FirstThread()
{
int counter = 0;
lock(m_smplQueue)
{
while(counter < MAX_LOOP_TIME)
{
//Wait, if the queue is busy.
Monitor.Wait(m_smplQueue);
//Push one element.
m_smplQueue.Enqueue(counter);
//Release the waiting thread.
Monitor.Pulse(m_smplQueue);
phản++;
}
}
}
public void SecondThread()
{
lock(m_smplQueue)
{
//Release the waiting thread.
Monitor.Pulse(m_smplQueue);
//Wait in the loop, while the queue is busy.
//Exit on the time-out when the first thread stops.
while(Monitor.Wait(m_smplQueue,1000))
{
//Pop the first element.
int counter = (int)m_smplQueue.Dequeue();
//Print the first element.
Console.WriteLine(counter.ToString());
//Release the waiting thread.
Monitor.Pulse(m_smplQueue);
}
}
}
//Return the number of queue elements.
public int GetQueueCount()
{
return m_smplQueue.Count;
}
void tĩnh Main(chuỗi[] args)
{
//Create the MonitorSample object.
MonitorSample test = new MonitorSample();
//Create the first thread.
Thread tFirst = new Thread(new ThreadStart(test.FirstThread));
//Create the second thread.
Thread tSecond = new Thread(new ThreadStart(test.SecondThread));
//Start threads.
tFirst.Start();
tSecond.Start();
//wait to the end of the two threads
tFirst.Join();
tSecond.Join();
//Print the number of queue elements.
Console.WriteLine("Queue Count = " + test.GetQueueCount().ToString());
}
}
我看不到使用 Wait And Pulse 代替这个的好处:
public void FirstThreadTwo()
{
int counter = 0;
while (counter < MAX_LOOP_TIME)
{
lock (m_smplQueue)
{
m_smplQueue.Enqueue(counter);
phản++;
}
}
}
public void SecondThreadTwo()
{
while (true)
{
lock (m_smplQueue)
{
int counter = (int)m_smplQueue.Dequeue();
Console.WriteLine(counter.ToString());
}
}
}
非常感谢任何帮助。谢谢
câu trả lời hay nhất
要描述“优势”,一个关键问题是“超过什么?”。如果您的意思是“优先于热循环”,那么 CPU 利用率是显而易见的。如果您的意思是“优先于 sleep /重试循环”- 您可以获得更快的响应(Pulse
不需要等待那么久)并且使用较低的 CPU(你没有不必要地醒来 2000 次)。
不过,一般来说,人们的意思是“优先于 Mutex 等”。
我倾向于广泛地使用这些,甚至优先于互斥锁、重置事件等;原因:
Khóa
来处理同步,所以当我需要等待时,我很可能已经有了Khóa
为了某事
关于c# - Monitor.Pulse 和 Monitor.Wait 有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6575723/
Tôi đã gặp câu hỏi này trong một cuộc phỏng vấn. Sự khác biệt giữa chờ và chờ đúng giờ trong chuỗi là gì? Tôi biết rằng phương thức chờ làm cho luồng hiện tại đợi cho đến khi một luồng khác gọi phương thức notification() của đối tượng này hoặc notificationAll
Tôi có một đoạn mã java ở đây khiến tôi tự hỏi sự khác biệt giữa việc gọi wait() và this.wait() là gì. Giả sử bạn có một lớp có phương thức lấy tài nguyên và nó được đồng bộ hóa. Thông thường, nếu tài nguyên không có sẵn, tôi sẽ
Tôi biết cách chờ trong hàng đợi nhân Linux bằng wait_event và cách đánh thức chúng. Bây giờ tôi cần tìm ra cách xếp hàng chờ nhiều người cùng một lúc. Tôi cần ghép nhiều nguồn sự kiện, về cơ bản theo cách tương tự như thăm dò ý kiến hoặc chọn
Sự khác biệt giữa chờ (null) và chờ (&trạng thái) trong lập trình hệ thống c là gì? Nội dung của trạng thái con trỏ là gì? Câu trả lời hay nhất Nếu bạn gọi wait(NULL) ( wait(2) ), bạn sẽ chỉ đợi mọi tiến trình con kết thúc. Sử dụng w
Hãy tưởng tượng: Người dùng nhấp vào một nút trên Chế độ xem gọi lệnh DoProcessing trên ViewModel Xem xét trách nhiệm của Chế độ xem và ViewModel, con trỏ Chờ được đặt ở đâu và như thế nào? Để xóa
Tôi đã thấy FluentWait và WebDriverWait trong mã sử dụng Selenium. FluentWait sử dụng công nghệ thăm dò ý kiến, tức là nó sẽ thăm dò một WebElement cụ thể trong mỗi khoảng thời gian cố định. tôi muốn biết
Tôi đã viết đoạn mã sau trong đó phương thức bắt đầu sẽ đợi cho đến khi phương thức dừng thông báo. Nhưng trong quá trình thực thi, dòng nhật ký bên dưới phương thức bắt đầu được in ra, mặc dù tôi đã chỉ định nó chờ. Hình ảnh bên dưới cho thấy phương thức bắt đầu của tôi được triển khai như thế nào. riêng tư
Tôi có đoạn mã sau để kết nối với SignalR Hub tĩnh riêng tư không đồng bộ Task StartListening() { try {
Tôi rất bối rối về cách hoạt động của phương thức wait() trong các luồng. Giả sử tôi viết: public class test3 { public static void main(String args[]){
Trong khi xây dựng hàng đợi giới hạn an toàn theo luồng bằng cách sử dụng các nguyên hàm của luồng Java - sự khác biệt giữa hai cấu trúc khi tạo một đối tượng bị khóa rõ ràng là gì. Sử dụng danh sách làm khóa và chờ đợi nó. Ví dụ 1 khóa cuối cùng riêng tư Khóa đối tượng = mới
Câu chuyện: Có một lớp FluentWait trong liên kết ngôn ngữ selen Java, cho phép kiểm soát chặt chẽ cách kiểm tra các điều kiện dự kiến: Mỗi phiên bản FluentWait được xác định
Sự khác biệt giữa các thuật toán chờ chết và chờ đợi vết thương là gì? Cả hai kỹ thuật ngăn chặn bế tắc dường như đều làm được điều tương tự: khôi phục quy trình cũ. Sự khác biệt giữa hai là gì? Vui lòng cung cấp một ví dụ phù hợp để so sánh hai thuật toán này. Câu trả lời hay nhấtChờ chết
Trong kết xuất luồng Java, bạn có thể thấy khóa được đề cập trong dấu vết ngăn xếp. Dường như có ba loại thông tin: 1: - bị khóa (một java.io.BufferedInputStream) 2: - đang chờ l
Đoạn mã sau mất khoảng 20 giây để chạy. Tuy nhiên, việc bỏ ghi chú chỉ mất chưa đầy một giây. Tại sao lại có sự khác biệt lớn như vậy? Cập nhật: Mất 9 giây khi sử dụng ag.Add. Tôi đã cập nhật mã. mở FSharpx.Control
Tôi có một sự kiện nhấp chuột phía máy chủ trên trang web ASP.NET WebForms. Trong trường hợp này, tôi gọi một phương thức để gọi phương thức đối tác không đồng bộ của nó, thêm .Wait() vào cuộc gọi. Phương pháp này sau đó giảm xuống một vài cấp độ (tức là gọi một cấp độ khác
Có 3 trạng thái của một luồng ở trạng thái Hoạt động nhưng không chạy và không thể chạy được: - chờ bị chặn khi ngủ Khi một luồng thực thi phương thức sleep(), nó sẽ chuyển từ trạng thái chạy trong khoảng thời gian được chỉ định bởi tham số của nó ( chẳng hạn như vài mili giây) chuyển sang chế độ ngủ đông
Hãy xem xét đoạn mã sau public class ThreadTest1 { Private static Final long startTime = System.currentTimeMillis();
Tôi có một ứng dụng Java sử dụng các luồng và sử dụng nhiều phiên bản đối tượng Khóa để đồng bộ hóa quyền truy cập vào tài nguyên công cộng. Bây giờ, như một phần của phép đo hiệu suất, tôi muốn đo thời gian mỗi luồng sử dụng trong mỗi khóa. Cho đến nay tôi đã cố gắng
Tôi đã viết đoạn mã sau: let first_row = row_stream.take(1).wait(); và gặp lỗi sau (khi tôi thực sự muốn truy cập phần tử): đã tìm thấy struct `futures:
Tôi đã sử dụng hai lệnh để đợi thiết bị khởi động: adb wait-for-device và adb wait-for-device. Cả hai dường như đều đợi thiết bị khởi động và tôi không thấy bất kỳ sự khác biệt nào trong hành vi của chúng. Họ có cư xử khác nhau không? Thêm thông tin thêm về những gì tôi đã làm: Đây là những gì tôi đã làm,
Tôi là một lập trình viên xuất sắc, rất giỏi!