AmazonSimpleEmailServiceClient.sendEmail() ;按照java文档使用
使用此客户端进行的所有服务调用都是阻塞的,并且在服务调用完成之前不会返回。
简单的问题是,它是线程安全的吗?多个线程可以使用同一个实例并行AmazonSimpleEmailServiceClient调用吗sendEmail()?就像,假设我的网站的多个用户试图同时在该网站上注册。
我一直在研究 Boost 的 future,想知道它们是否是检查单个线程是否已完成的可接受且安全的方法。
我以前从未使用过它们,所以我编写的大部分代码都是基于Boost 的同步文档。
#include <iostream>
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>
int calculate_the_answer_to_life_the_universe_and_everything()
{
boost::this_thread::sleep(boost::posix_time::seconds(10));
return 42;
}
int main()
{
boost::packaged_task<int> task(calculate_the_answer_to_life_the_universe_and_everything);
boost::unique_future<int> f(task.get_future());
boost::thread th(boost::move(task));
while(!f.is_ready())
{
std::cout << "waiting!" << std::endl;
boost::this_thread::sleep(boost::posix_time::seconds(1));
}
std::cout << f.get() << std::endl;
th.join();
}
Run Code Online (Sandbox Code Playgroud)
这似乎在等待calculate_the_answer_to_life_the_universe_and_everything()线程返回42。这可能会出现问题吗?
谢谢!
我决定使用Wait Functions (WaitForSingleObject、WaitForMultipleObject 等)来正确退出线程。在这种情况下,问题是我是否需要显式调用 CloseHandle(线程句柄)以避免内存泄漏或等待函数自行清理并关闭句柄?如果CloseHandle需要显式调用,我可以再次调用“ CreateThread(相同的线程句柄)吗?我可以再次调用GetExitCodeThread()吗?”吗?”
注意:一个 StackOverFlow 问题回答了我,第二部分说我无法再次调用 GetExitCode,但它并没有澄清在等待函数后缺少调用 CloseHandle 是否会导致内存泄漏。
我有一个嵌套地图的案例,如下所示:
private final static Map<String, TreeMap<Long,String>> outerConcurrentMap = new ConcurrentHashMap<>();
Run Code Online (Sandbox Code Playgroud)
我知道这ConcurrentHashMap是线程安全的,但我想知道TreeMap这个 CHM 持有的 s ,它们在 CHM 内部也是线程安全的吗?
我正在做的操作是:
get(K)使用.从 CHM 检索 TreeMaptailMap(K,boolean)。clear()CHM。在这种情况下我想要一个线程安全的结构。上述实现是否线程安全?如果没有,请提出解决方案。
假设 foo 和 bar 是原子。
; consistent.
(reset! foo x)
; inconsistent x and y combination.
(reset! bar y)
; consistent.
Run Code Online (Sandbox Code Playgroud)
是否可以立即重置它们,以便其他线程看不到这种不一致?或者是否有必要将 x 和 y 捆绑成一个原子,而不是让 x 和 y 本身成为原子?
当我并行运行测试类时,失败的测试数量比运行串行测试类时要高。为了调试目的,我在控制台上记录了很多内容,但在并行运行时几乎没有用,因为记录的所有内容都是混乱/无序的。
在我尝试修复日志记录问题以便更好地调试之前,我想知道,如果我设置了parallel="classes",它是否能保证线程安全?我假设如果我设置parallel="tests"两个方法可能会尝试访问范围内的同一对象,从而导致线程安全问题。
IE:
<suite name="test" parallel="classes" thread-count="3">
Run Code Online (Sandbox Code Playgroud) 一个通道可能被多个 Go 例程使用。使用某些 Go 例程中的 len(channel) 获取通道的长度是线程安全的吗?
前提
我正在开发一个多人游戏,我有许多网络控制的演员,我决定将女巫的输入存储在一个易变的字典中:
public static volatile Dictionary<string, QuickMessage> quickPlayerMessages;
Run Code Online (Sandbox Code Playgroud)
并且每一帧演员都从该字典中获取他们的值,但与此无关,我还有一个接收器线程不断更新该字典,因此值会不断更改,并且键可能会被删除或添加到其中。我做了一些测试,这有效,但是......
我的顾虑
我不完全理解 volatile 修饰符,我知道它应该消除一些可能导致读取部分写入信息的优化。我还听说这并不像使用锁定机制那样真正起作用。虽然我确实选择了这个解决方案,因为它为我减少了很多复杂性,而且看起来它的响应速度相当快(速度方面),但我确实对此感到不安。
是否有任何可能出现的问题或我应该从这种方法中意识到的问题?
这个问题中的 while 循环是线程安全的:AtomicInteger thread safety。如果我在线程安全的 while 循环中插入 randomSum 方法,代码是否仍然是线程安全的?还是应该同步 randomSum 方法?
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
public class Print implements Runnable {
static AtomicInteger atomicInteger = new AtomicInteger(0);
static Random random = new Random(1);
public static int randomSum() {
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += random.nextInt();
}
return sum;
}
@Override
public void run() {
while (atomicInteger.getAndIncrement() < 100)
System.out.println(randomSum() + " " + Thread.currentThread());
}
public …Run Code Online (Sandbox Code Playgroud) 我用std::mapC++11编码。
我读过这个链接,它告诉我 C++11 标准保证 const 方法对容器的访问从不同的线程是安全的。
据我了解,这意味着它std::map::size()是线程安全的,因为这个函数被声明为size_type size() const noexcept;.
现在我想但是,有两个版本std::map::find线程安全地调用该函数。例如,if (mp.find(xxx) != mp.end()) {}。find,一个是const,另一个是非const:https : //en.cppreference.com/w/cpp/container/map/find。
那么我怎么知道find调用的是哪个版本呢?如何强制find调用const-version以获得线程安全代码?
我知道有一个 const 版本的std::map::cend(),会if (mp.find(xxx) != mp.cend()) {}按预期工作吗?
thread-safety ×10
c++ ×3
java ×3
concurrency ×2
boost ×1
c# ×1
c++11 ×1
channel ×1
clojure ×1
go ×1
memory-leaks ×1
networking ×1
stl ×1
testng ×1
treemap ×1
volatile ×1
wait ×1
winapi ×1