草庐IT

Semaphore

全部标签

c++ - 在 C++11 中等待多个条件变量的最佳方法是什么?

首先介绍一下上下文:我正在学习C++11中的线程,为此,我正在尝试构建一个小的actor类,本质上(我把异常处理和传播的东西排除在外)像这样:classactor{private:std::atomicstop;private:std::condition_variableinterrupt;private:std::threadactor_thread;private:message_queueincoming_msgs;public:actor():stop(false),actor_thread([&]{run_actor();}){}public:virtual~actor()

c++ - 在 C++11 中等待多个条件变量的最佳方法是什么?

首先介绍一下上下文:我正在学习C++11中的线程,为此,我正在尝试构建一个小的actor类,本质上(我把异常处理和传播的东西排除在外)像这样:classactor{private:std::atomicstop;private:std::condition_variableinterrupt;private:std::threadactor_thread;private:message_queueincoming_msgs;public:actor():stop(false),actor_thread([&]{run_actor();}){}public:virtual~actor()

c++ - 在什么情况下,您在 C++ 中使用信号量而不是互斥量?

在我阅读的有关多线程的资源中,与信号量相比,互斥锁更常被使用和讨论。我的问题是你什么时候在互斥锁上使用信号量?我在Boost线程中看不到信号量。这是否意味着这些天不再使用信号量了?据我所知,信号量允许多个线程共享一个资源。这只有在那些线程只读取资源而不是写入时才有可能。这是正确的吗? 最佳答案 互斥锁的典型用例(任何时候只允许一个线程访问资源)比信号量的典型用例要普遍得多。但信号量实际上是更一般的概念:互斥体(几乎)是信号量的特例。典型的应用程序是:您不想创建超过(例如)5个数据库连接。无论有多少工作线程,它们都必须共享这5个连接。

c++ - 在什么情况下,您在 C++ 中使用信号量而不是互斥量?

在我阅读的有关多线程的资源中,与信号量相比,互斥锁更常被使用和讨论。我的问题是你什么时候在互斥锁上使用信号量?我在Boost线程中看不到信号量。这是否意味着这些天不再使用信号量了?据我所知,信号量允许多个线程共享一个资源。这只有在那些线程只读取资源而不是写入时才有可能。这是正确的吗? 最佳答案 互斥锁的典型用例(任何时候只允许一个线程访问资源)比信号量的典型用例要普遍得多。但信号量实际上是更一般的概念:互斥体(几乎)是信号量的特例。典型的应用程序是:您不想创建超过(例如)5个数据库连接。无论有多少工作线程,它们都必须共享这5个连接。

concurrency - Go 中惯用的可变大小工作池

我正在尝试在Go中实现一个worker池。go-wiki(以及Channels部分中的EffectiveGo)提供了边界资源使用的优秀示例。只需使用与工作池一样大的缓冲区创建一个channel。然后用worker填充该channel,并在完成后将它们发送回channel。从channel阻塞接收,直到有工作人员可用。所以channel和循环就是整个实现——非常酷!或者,可以阻止发送到channel,但同样的想法。我的问题是关于在运行时更改工作池的大小。我不相信有办法改变channel的大小。我有一些想法,但大多数似乎都太复杂了。Thispage实际上使用channel和空结构以几乎相同

concurrency - Go 中惯用的可变大小工作池

我正在尝试在Go中实现一个worker池。go-wiki(以及Channels部分中的EffectiveGo)提供了边界资源使用的优秀示例。只需使用与工作池一样大的缓冲区创建一个channel。然后用worker填充该channel,并在完成后将它们发送回channel。从channel阻塞接收,直到有工作人员可用。所以channel和循环就是整个实现——非常酷!或者,可以阻止发送到channel,但同样的想法。我的问题是关于在运行时更改工作池的大小。我不相信有办法改变channel的大小。我有一些想法,但大多数似乎都太复杂了。Thispage实际上使用channel和空结构以几乎相同

linux - 我们什么时候应该使用互斥锁,什么时候应该使用信号量

什么时候应该使用互斥体,什么时候应该使用信号量? 最佳答案 这是我记得什么时候使用什么-信号量:当您(线程)想要sleep时使用信号量,直到其他线程告诉您醒来。信号量“向下”发生在一个线程(生产者)中,信号量“向上”(对于相同的信号量)发生在另一个线程(消费者)中例如:在生产者-消费者问题中,生产者想要休眠直到至少一个缓冲槽为空——只有消费者线程才能知道缓冲槽何时为空。互斥:当您(线程)想要执行不应由任何其他线程同时执行的代码时,请使用互斥锁。Mutex'down'发生在一个线程中,mutex'up'必须稍后发生在同一个线程中。例如

linux - 我们什么时候应该使用互斥锁,什么时候应该使用信号量

什么时候应该使用互斥体,什么时候应该使用信号量? 最佳答案 这是我记得什么时候使用什么-信号量:当您(线程)想要sleep时使用信号量,直到其他线程告诉您醒来。信号量“向下”发生在一个线程(生产者)中,信号量“向上”(对于相同的信号量)发生在另一个线程(消费者)中例如:在生产者-消费者问题中,生产者想要休眠直到至少一个缓冲槽为空——只有消费者线程才能知道缓冲槽何时为空。互斥:当您(线程)想要执行不应由任何其他线程同时执行的代码时,请使用互斥锁。Mutex'down'发生在一个线程中,mutex'up'必须稍后发生在同一个线程中。例如

java - ThreadPoolExecutor 的 submit() 方法饱和后如何阻塞?

我想创建一个ThreadPoolExecutor,当它达到最大大小并且队列已满时,submit()方法blocks尝试添加新任务时。我是否需要为此实现自定义RejectedExecutionHandler或者是否有使用标准Java库来执行此操作的现有方法? 最佳答案 我刚刚找到的一种可能的解决方案:publicclassBoundedExecutor{privatefinalExecutorexec;privatefinalSemaphoresemaphore;publicBoundedExecutor(Executorexec,i

java - ThreadPoolExecutor 的 submit() 方法饱和后如何阻塞?

我想创建一个ThreadPoolExecutor,当它达到最大大小并且队列已满时,submit()方法blocks尝试添加新任务时。我是否需要为此实现自定义RejectedExecutionHandler或者是否有使用标准Java库来执行此操作的现有方法? 最佳答案 我刚刚找到的一种可能的解决方案:publicclassBoundedExecutor{privatefinalExecutorexec;privatefinalSemaphoresemaphore;publicBoundedExecutor(Executorexec,i