gpt4 book ai didi

c# - 使用c#锁定共享数据

转载 作者:太空狗 更新时间:2023-10-29 21:42:10 25 4
gpt4 key购买 nike

我有一个程序 (C#),其中包含要执行的测试列表。
另外,我有两个线程。一种是将任务添加到列表中,另一种是从列表中读取和删除已执行的任务。
每次其中一个线程想要访问列表时,我都会使用“锁定”功能。
我想做的另一件事是,如果列表为空,则需要从列表中读取的线程将休眠。并在第一个线程向列表中添加任务时唤醒。这是我写的代码:

...
List<String> myList = new List();
Thread writeThread, readThread;
writeThread = new Thread(write);
writeThread.Start();
readThraed = new Thread(read);
readThread.Start();
...
private void write()
{
while(...)
{
...
lock(myList)
{
myList.Add(...);
}
...
if (!readThread.IsAlive)
{
readThraed = new Thread(read);
readThread.Start();
}
...
}
...
}

private void read()
{
bool noMoreTasks = false;
while (!noMoreTasks)
{
lock (MyList)//syncronize with the ADD func.
{
if (dataFromClientList.Count > 0)
{
String task = myList.First();
myList.Remove(task);
}
else
{
noMoreTasks = true;
}
}
...
}
readThread.Abort();
}

显然我做错了,没有按预期执行(readTread 没有从列表中读取)。
有谁知道我的问题是什么,以及如何解决?
非常感谢,

最佳答案

你需要的是一个阻塞队列。它就像一个普通的队列,除了 Dequeue 方法会在没有队列时阻塞。 Here是一个实现。一旦你实现了阻塞队列,那么其他一切都很容易。请注意您使用的阻塞队列的实现。我已经看到很多存在细微线程问题的示例。最好坚持使用我提供的链接。

public class Example
{
private BlockingQueue<Task> m_Queue = new BlockingQueue<Task>();

public void StartExample()
{
Thread producer = new Thread(() => Producer());
Thread consumer = new Thread(() => Consumer());
producer.Start();
consumer.Start();
producer.Join();
consumer.Join();
}

private void Producer()
{
for (int i = 0; i < 10; i++)
{
m_Queue.Enqueue(new Task());
}
}

private void Consumer()
{
while (true)
{
Task task = m_Queue.Dequeue();
}
}
}

关于c# - 使用c#锁定共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2721845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com