- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在练习readers and writers problem并提出以下解决方案。但是,在打印出以下结果后,程序会自行阻塞。
$ Read content: planets
我的想法是 first solution 的修改版本。使用 2 个信号量,一个称为 readMutex,确保一次只有一个读取线程更新 numOfReaders,而另一个信号量称为 accessToResource,确保当读取器正在阅读内容,作者应该等待。这是我的代码。
import java.util.concurrent.Semaphore;
public class ReadersAndWriters {
public static final Semaphore accessToResource = new Semaphore(1, true);
public static final Semaphore readMutex = new Semaphore(1, true);
public static String content = "planets";
public static int numOfReaders;
static class Reader extends Thread {
void read() {
try {
readMutex.acquire();
numOfReaders++;
if (numOfReaders == 1) {
accessToResource.acquire();
}
readMutex.release();
// read content, not a critical section
System.out.println("Read content:\t" + content);
readMutex.acquire();
numOfReaders--;
if (numOfReaders <= 0) {
accessToResource.release();
}
readMutex.release();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
read();
}
}
static class Writer extends Thread {
String text;
Writer(String text) {
this.text = text;
}
void write() {
try {
readMutex.acquire();
accessToResource.acquire();
// critical section
content = text;
System.out.println("Content changed:\t" + content);
// end of critical section
accessToResource.release();
readMutex.release();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
write();
}
}
public static void main(String[] args) {
Reader t1 = new Reader();
Reader t2 = new Reader();
Writer t3 = new Writer("stars");
Reader t4 = new Reader();
Writer t5 = new Writer("restaurant at the end of universe");
Reader t6 = new Reader();
Reader t7 = new Reader();
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
}
}
最佳答案
当一个Reader
已获取accessToResource
并尝试获取readMutex
时:
if (numOfReaders == 1) {
accessToResource.acquire();
}
readMutex.release();
System.out.println("Read content:\t" + content);
readMutex.acquire(); // -------> here
当另一个Writter
已获取readMutex
并尝试获取accessToResource
时:
readMutex.acquire();
accessToResource.acquire(); // ------> here
发生死锁。
由于 accessToResource
和 readMutex
的许可为 1
,因此 Reader
和 都没有权限作家
可以继续前进。
关于java - 为什么读者和作者众多,却陷入僵局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51268230/
我无法理解为什么第一个读者-作者问题会导致写进程饿死,即:代码如何为读者进程提供优先级?当其中一个读取进程执行 signal(wrt) 时,写入进程是否应该无法获得锁定?是信号量列表的结构(正如我所看
我正在使用R处理人口普查数据,该数据使用了很长的数字GEOID来标识地理位置。我面临的问题是,当使用write_csv(来自readr包)写出处理后的数据时,正在以科学计数法编写这些GEOID。有办法
我为 Java 中的读写器问题开发了一个解决方案(有关此的一些信息 http://lass.cs.umass.edu/~shenoy/courses/fall08/lectures/Lec11.pdf
以下代码是Java中的Passing the Baton程序的一部分: 主要 P1(作家) P2(作家) P3(阅读器) P4(阅读器) 主要(); package ReadersPreference
我正在使用 ReaderWriterLockSlim保护一些操作。我想偏爱读者而不是作者,这样当读者长时间持有锁并且作者试图获取写锁时,进一步的读者不会被作者的尝试阻塞(如果作者在 lock.Ente
我觉得这可能是一种非常普遍和常见的情况,存在众所周知的无锁解决方案。 简而言之,我希望有像读者/作者锁这样的方法,但这不需要读者获取锁,因此可以获得更好的平均性能。 相反,读者需要一些原子操作(128
我遇到了读者-作者问题。我想写出作家喜欢使用互斥锁的解决方案。到目前为止我已经写了这个 #include #include #include #include #include #inclu
这个程序读取“电子邮件”(实际上只是一个像电子邮件一样结构的 .txt 文件)并用它做各种事情(在 map 中存储数据并对其进行操作)。 但是,我在根据主题搜索输出电子邮件的“消息”时遇到了一个不寻常
我正在从 UIWebView 切换到 WKWebView,不知道如何设置我的配置以使用 Reader. 有没有人可以帮助我? viewDidLoad: WKWebViewConfiguration *
我正在练习 Visual Basic 编程我在 Visual Basic 中有两种形式。第一个表单有一个命令按钮,将显示第二个表单的输入数据第二种形式有一个文本框,我需要在其中输入数据并保存它。 我在
我想寻求有关此任务的帮助。 我的任务是用 C 编写一个简单的程序来模拟读写器问题。程序要求是: 程序启动后,会要求用户输入作者和读者的输入次数。 程序会不断通知用户线程的状态。 程序结束后,小统计(每
我有一个用 C 语言模拟读者-作者问题的简单程序。要求用户输入作者数和读者数。然后创建随机数的编写器 - 线程和读取器 - 线程。项目的写入由全局变量 itemsCount 模拟 - 它代表新插入项目
我有一个“静态 64 位整数变量”,它仅由一个线程更新。所有其他线程仅从中读取。 出于安全原因,我是否应该使用原子操作(例如“__sync_add_and_fetch”)来保护这个变量? 还是可以直接
我是一名优秀的程序员,十分优秀!