我有一个非常简单的场景。以下方法尝试访问锁,等待 1 秒并最终释放锁。
private final Lock lock = new ReentrantLock();
public void lockAndWait() {
logger.info("I {} am here", Thread.currentThread().getName());
lock.lock();
try {
logger.info("I {} got the lock", Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} finally {
lock.unlock();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在运行以下测试:
@Test
public void lockTest() {
for (int i = 0; i < 10; i++) {
new Thread(() -> lockAndWait()).start();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下日志输出:
12-10-2023 17:11:04 [Thread-2 ] INFO I Thread-2 am here
12-10-2023 17:11:04 …Run Code Online (Sandbox Code Playgroud) 我正在努力完成一项简单的任务,但我遇到了很大的困难.
请假设我有一个GenServer,其中一个回调如下:
@impl true
def handle_call(:state, _, state) do
# Something that would require 10 seconds
newState = do_job()
{:reply, newState, newState}
end
Run Code Online (Sandbox Code Playgroud)
如果我是对的,GenServer.call(:server, :state)从客户端调用会阻塞服务器10秒钟,然后新状态将返回给客户端.
好.我希望服务器在不被阻止的情况下处理此任务.我使用任务尝试过,但Task.await/2和Task.yield/2阻塞服务器.
我希望服务器不要阻塞,并在那10秒后,在客户端终端上接收结果.这怎么可能?
所以我有以下8个元素的int数组:
int v[8] = {0, 1, 2, 3, 4, 5, 6, 7};
Run Code Online (Sandbox Code Playgroud)
我将此数组作为循环中的参数传递给函数
while(i < N) {
.
.
function(v);
.
.
}
Run Code Online (Sandbox Code Playgroud)
在这个函数中我使用前4个元素,在下一个循环中我想增加数组地址4个位置,这样我就可以使用最后4个元素.因为int是4个字节,所以我想的是:
while(i < N) {
.
.
function(v);
.
*v += 16;
}
Run Code Online (Sandbox Code Playgroud)
但是,这并没有达到我的预期.
注意:因为我正在使用嵌入式系统,所以我无法使用malloc.我的阵列必须以我相信的方式宣布.
问题(编辑):
如何增加我的数组的地址,以便第二次迭代v指向v [4]?
arrays ×1
c ×1
concurrency ×1
elixir ×1
gen-server ×1
java ×1
java-17 ×1
nonblocking ×1
sleep ×1