gpt4 book ai didi

java - 并发解谜: Java Concurrency - Cyclicbarrier. 正确用法?

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:40 24 4
gpt4 key购买 nike

我正在尝试编写一个程序来解决两个无法独立解决的难题,但它们具有相同的解决方案。我的想法是,它们都在单独的线程中运行,直到它们停止查找新信息。然后,他们通过更新一些共享状态变量来传达他们所发现的内容,如果他们中的任何一个将某些内容写入共享状态,则继续。

我认为 CyclicBarrier 是在这里使用的合适机制。这是我的代码(在 2 个线程中同时运行:

while (true) {

doSolvingLogicHere();

shareUpdates(); // this method updates the shared state variable and is synhronized

int count;
int updates = 0;
try {
count = writeBarrier.await();
updates = threadsUpdatedSomething;
if (count == 0) {
writeBarrier.reset();
threadsUpdatedSomething = 0; //'reset' the shared value
}
} catch (InterruptedException ex) {
Logger.getLogger(TwinSolver.class.getName()).log(Level.SEVERE, null, ex);
} catch (BrokenBarrierException ex) {
Logger.getLogger(TwinSolver.class.getName()).log(Level.SEVERE, null, ex);
}
if (updates == 0) { //no thread updated something
break;
} else { // at least one of the threads updated something, solving should continue in both threads
readUpdates();
}
}

ThreadsUpdatedSomething 是一个共享整数,如果线程更新了任何内容,它会在“ShareUpdates()”中递增。当两个线程在迭代中没有发现任何新内容时,这意味着它们永远不会发现任何新内容,并且应该停止两个线程的整个循环。这就是为什么我要检查它是否为零。

当两个线程没有在共享状态变量中写入任何新信息时,我希望它们都停止。但是当运行程序时,其中一个线程停止,而另一个线程继续运行。调试程序并在“readUpdates()”行设置断点时,程序按预期工作。

这是处理此类并发“求解”循环的正确方法吗?如果它是正确的,我的代码中的错误在哪里?

感谢您的帮助!

编辑:纠正了小错误。 '更新=threadsUpdatedSomething;'现在在正确的地方

最佳答案

根据 API等待返回

the arrival index of the current thread, where index getParties() - 1 indicates the first to arrive and zero indicates the last to arrive

count = writeBarrier.await();

话虽这么说,所以只有一个线程会收到 0。并且只有一个线程会将 updates 值设置为 0。这就是为什么最后到达的线程停止而另一个线程没有停止。

根据您的陈述,当您发现两个线程都没有更新threadsUpdatedSomething时,您需要停止线程。我假设线程更新的时间为零。如果不是,你必须改变逻辑,一些如何找到何时必须打破条件并应用它

while (true) {

doSolvingLogicHere();

shareUpdates(); // this method updates the shared state variable and is synhronized

int count;
int updates = 0;
try {
writeBarrier.await();
if (threadsUpdatedSomething == 0) {
updates = threadsUpdatedSomething;
writeBarrier.reset();
threadsUpdatedSomething -= 2; //'reset' the counter by decrementing 2
}
} catch (InterruptedException ex) {
Logger.getLogger(TwinSolver.class.getName()).log(Level.SEVERE, null, ex);
} catch (BrokenBarrierException ex) {
Logger.getLogger(TwinSolver.class.getName()).log(Level.SEVERE, null, ex);
}
if (updates == 0) { //no thread updated something
break;
} else { // at least one of the threads updated something, solving should continue in both threads
readUpdates();
}
}

此外,如果需要,不要忘记在异常情况下设置中断条件。

关于java - 并发解谜: Java Concurrency - Cyclicbarrier. 正确用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22914882/

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