- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于我在这里发布这么长的代码,我深表歉意,但我没有其他方法可以帮助您重现我的问题。我给你的代码当然是我正在使用的代码的缩影。我知道我可以使用 QueueUserWorkItem
直到最近我还在使用它,但我意识到我的线程太短以至于我的 ThreadDispatcher
方法在第一个完成。所以我想看看这种方式是否更快。问题是我遇到了僵局,我真的不明白为什么。我正在发布您可以直接编译和重现问题的代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace TestWhatever
{
public class Program
{
static MyClass ThisClass = new MyClass();
static void Main()
{
ThisClass.Start();
for (int Cnt = 0; Cnt < 5; Cnt++)
{
Console.WriteLine("Launching Frame " + Cnt);
ThisClass.Update();//Frames loop
}
}
}
public class MyClass
{
Random MyRandom = new Random();
public static object _MultiDispatcherLocker = new object();
public static bool MonoDispacherThreadLocked = true;
public static bool MultiDispacherThreadLocked = true;
// Thread pool in multithreading case
private int MaxThreadsInParallel = 5;
private static int MaxNumOfPool = 20;
private Thread[] ThreadsPool;
public static object _ThreadLockerList;
private Func<string>[] ThreadFunctions;
public bool[] ThreadLockedBools = Enumerable.Repeat(true, MaxNumOfPool).ToArray();
public void Start()
{
StartThreads();
}
public void Update()
{
lock (_MultiDispatcherLocker)
{
MultiDispacherThreadLocked = false;
Monitor.Pulse(_MultiDispatcherLocker);
}
Thread.Sleep(1000);
}
private void StartThreads()
{
ThreadsPool = new Thread[MaxNumOfPool];
_ThreadLockerList = new object();
ThreadFunctions = new Func<string>[MaxNumOfPool];
ThreadLockedBools = new bool[MaxNumOfPool];
for (int Cnt = 0; Cnt < MaxNumOfPool; Cnt++)
{
Console.WriteLine("Preparing ThreadID: " + Cnt);
ThreadLockedBools[Cnt] = true;
ThreadsPool[Cnt] = new Thread(new ParameterizedThreadStart(LaunchThread));
ThreadsPool[Cnt].Start(Cnt);
}
Thread ThreadedMainThread = new Thread(new ThreadStart(ThreadDispatcher));
ThreadedMainThread.Start();
ThreadedMainThread.Priority = System.Threading.ThreadPriority.Highest;
}
private void LaunchThread(object iThreadID)
{
int ThreadID = (int)iThreadID;
lock (_ThreadLockerList)
{
while (ThreadLockedBools[ThreadID])
Monitor.Wait(_ThreadLockerList);
}
while (true)
{
Console.WriteLine("Starting ThreadID: " + ThreadID);
ThreadFunctions[ThreadID]();
Console.WriteLine("Ending ThreadID: " + ThreadID);
lock (_MultiDispatcherLocker)
{
ThreadLockedBools[ThreadID] = true;
MultiDispacherThreadLocked = false;
Monitor.Pulse(_MultiDispatcherLocker);
}
lock (_ThreadLockerList)
{
Console.WriteLine("Blocking ThreadID: " + ThreadID);
while (ThreadLockedBools[ThreadID])
Monitor.Wait(_ThreadLockerList);
}
}
}
private void ThreadDispatcher()//object Obj)
{
lock (_MultiDispatcherLocker)
{
while (MultiDispacherThreadLocked)
Monitor.Wait(_MultiDispatcherLocker);
}
while (true)
{
for (int Cnt = 0; Cnt < 20; Cnt++)//Threads loop
{
if (RunningThreads() < MaxThreadsInParallel)
{
int CurrIntTest = MyRandom.Next(100000, 10000000);
int ThreadID = GetNextEmptyThread();
ThreadFunctions[ThreadID] = () => { MyMethodInThread(CurrIntTest); return null; };
lock (_ThreadLockerList)
{
ThreadLockedBools[ThreadID] = false;
Monitor.Pulse(_ThreadLockerList);
}
}
else//wait until someone ends
{
lock (_MultiDispatcherLocker)
{
while (MultiDispacherThreadLocked)
{
Monitor.Wait(_MultiDispatcherLocker);
}
}
}
}
lock (_MultiDispatcherLocker)
{
MultiDispacherThreadLocked = true;
while (MultiDispacherThreadLocked)
Monitor.Wait(_MultiDispatcherLocker);
}
}
}
private void MyMethodInThread(int Counter)
{
List<string> MyDummy = new List<string>();
for (int Cnt = 0; Cnt < Counter; Cnt++) MyDummy.Add("Dummy");
}
private int RunningThreads()
{
int ToReturn = 0;
for (int Cnt = 0; Cnt < MaxThreadsInParallel; Cnt++)
{
if (!ThreadLockedBools[Cnt] || ThreadsPool[Cnt].ThreadState != System.Threading.ThreadState.WaitSleepJoin)
ToReturn++;
}
return ToReturn;
}
private int GetNextEmptyThread()
{
for (int Cnt = 0; Cnt < MaxThreadsInParallel; Cnt++)
{
if (ThreadLockedBools[Cnt] && ThreadsPool[Cnt].ThreadState == System.Threading.ThreadState.WaitSleepJoin)
return Cnt;
}
return -1;
}
}
}
如果你能帮我解决这个问题,那就太棒了。
最佳答案
让我们看看你有什么。
LaunchThread
(多线程):
lock (_ThreadLockerList)
{
while (ThreadLockedBools[ThreadID])
Monitor.Wait(_ThreadLockerList);
}
ThreadDispatcher
(单线程):
lock (_ThreadLockerList)
{
ThreadLockedBools[ThreadID] = false;
Monitor.Pulse(_ThreadLockerList);
}
Monitor.Pulse
调用释放的线程不一定是ThreadLockedBools[ThreadID] = false
的线程,此时会立即进入 Monitor.Wait
再次,从而有效地吃信号。
要解决这个问题(通常在这种情况下),请使用 Monitor.PulseAll
相反。
关于c# - C#中自制线程池的多线程死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35819187/
我正在使用Delphi 7,并且有一个新单元要在我的项目中使用。我已经编译了新的。当我尝试通过将其添加到uses子句在项目中使用此单元时,出现错误,提示未找到.dcu文件。我还尝试将文件的完整路径放在
我有一个项目正在使用 mysql_connect()。 (我无法将其更改为 mysqli) 我收到错误:Call to undefined function mysql_connect() 我已经使用
我现在正在学习 jQuery,第一个“更大”的项目是一个自制的 Accordion /滑动导航。 我的 HTML 代码如下所示: Prologue TEST Projekte
我得到了这段用 JavaScript 编写的代码,但是对于大输入它返回了错误的数字。 它应该用模(mo)计算指数(ex)幂的底数。 我用 C 编写了等效代码并且正在运行。请有人告诉我出了什么问题。 尝
我正在通读 How can I write a power function myself? dan04 给出的答案引起了我的注意,主要是因为我不确定 fortran 给出的答案,但我接受了它并实现了
更新:可能是 jQuery 的 trigger() 在测试中做了一些额外的工作,我打开了一个 issue在 github 上。 ===== 我正在关注 learnQuery构建我的简单 jQuery。
我尝试了各种图库插件,但没有一个适合我的需要。 我有一些标记如下:
为了熟悉 swift 语言和 Cocoa,我决定创建一个小的基数转换,首先从基数 2 到基数 10,然后我想添加一些其他基数,例如 16 和 5。我仍然无法使其正常工作:Running App Vie
我开始编写自己的 vector 类,然后着手重载 = 运算符。我在下面有类似 somevector = someothervector 的代码,尽管我不确定它是否正确,因为我一直在为类似 someve
这里有一些非常相似的问题,但是它们无法帮助我解决这个问题。 另外,我提供了完整的示例代码,因此其他人可能更容易理解。 我制作了一个 vector 容器(出于内存原因,不能使用STL),过去只将oper
我制作了自己的 vector 模板,operator[]一部分: template T& vector::operator[](unsigned int index) { return m_
我们知道我们不应该写 SELECT *;相反,应该写下确实将在业务逻辑中使用的列(例如,在有关整篇文章的一次查询中SELECT blog_title, blog_content,以及SELECT bl
我使用 netbeans,当我准备为应用程序用户的管理创建一个 bean 时,我开始想知道:哪种方式更有益,保留数据库表并在其上应用 EJB,还是创建一个处理与数据库的连接并“手动”进行测试的 bea
所以基本上,作为安全措施(和学习过程),我尝试做的是我自己的“Capthca”系统。发生的情况是我有 20 个“标签”(为简洁起见,下面仅显示一个),每个 ID 都在 1 到 20 之间。我的 jav
我有一个类,它本质上是一个 std::vector具有一些附加功能。类(class)有find(const T& value )返回 value 第一次出现索引的方法或-1: int my::find
最近几天,我一直在尝试使用 Python 进行一些音频开发。 问题是,Mac OSX 不能很好地处理卸载问题。实际上,没有办法卸载任何东西。一旦它出现在您的系统上,您最好祈祷它没有做任何有趣的事情。因
我不明白以下错误消息,但我知道我之前已经在 Linux 上安装了 utf8-light ,没有出现任何问题。有人可以阐明出了什么问题吗?这是 LLVM 问题、GHC 7 问题还是 utf8-light
我是一名优秀的程序员,十分优秀!