我正在尝试为多个线程并发访问的资源实现一个简单的读/写锁。工作人员随机尝试读取或写入共享对象。当设置了读锁时,工作人员在锁被释放之前应该不能写。当设置了写锁时,不允许读和写。虽然我的实现似乎有效,但我认为它在概念上是错误的。
发生的读操作应该允许同时发生更多的读操作,从而导致总读取次数大于写入次数。我的程序产生的数字遵循工人执行这些操作的概率。
我觉得我的实现实际上根本不是并发的,但是我很难识别错误。我真的很感激被指出正确的方向。
调度和终止工人的主类:
class Main {
private static final int THREAD_NUMBER = 4;
public static void main(String[] args) {
// creating workers
Thread[] workers = new Thread[THREAD_NUMBER];
for (int i = 0; i < THREAD_NUMBER; i++) {
workers[i] = new Thread(new Worker(i + 1));
}
System.out.println("Spawned workers: " + THREAD_NUMBER);
// starting workers
for (Thread t : workers) {
t.start();
}
try {
Thread.sleep((long) 10000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// stopping workers
System.out.println("Stopping workers...");
for (Thread …Run Code Online (Sandbox Code Playgroud) 我有一个带有构造函数的类,该构造函数带有两个参数并将字段设置为这些值。我还希望通过在传递给构造函数的块内显式设置字段来初始化此类的对象。
构造函数:
class Grammar
attr_reader :rules, :start, ...
def initialize(rules, start)
@rules = rules
@start = start
...
end
end
Run Code Online (Sandbox Code Playgroud)
传递给构造函数的参数涉及创建几个对象,这些对象仅用作参数的中间构建块rules,start并且将这些对象的存在限制为传递给构造函数的块是有意义的。在此块中,我希望首先构建中间对象,然后直接设置新对象的字段。
我希望能够Grammar像这样实例化:
grammar = Grammar.new { |g|
...
# build rules and start
...
g.start = start
g.rules = rules
}
Run Code Online (Sandbox Code Playgroud)
我应该如何修改构造函数以允许两种初始化方法?
假设我有以下字节数组:
uint8_t barr[4] = {0xCE, 0xCE, 0xCE, 0xCE};
Run Code Online (Sandbox Code Playgroud)
给定索引n,我希望能够读取两个字节:
uint16_t d16 = barr[0];
Run Code Online (Sandbox Code Playgroud)
并且必须d16等于
0xCECE
Run Code Online (Sandbox Code Playgroud)
也许标准库中有一个可以执行此类任务的功能?