Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 信号量通过停止在自己的线程上运行的代码而死锁_C#_.net_Multithreading - Fatal编程技术网

C# 信号量通过停止在自己的线程上运行的代码而死锁

C# 信号量通过停止在自己的线程上运行的代码而死锁,c#,.net,multithreading,C#,.net,Multithreading,为了能够运行在多线程环境中不能很好扩展的库,我创建了一个对象池来自动创建有限数量的实例,以提高总吞吐量。我正在使用信号量lim来锁定/解锁对底层实例的访问 为了完整性起见,找到了派生自的ObjectPool 您使用零的初始计数初始化信号量: _objectAvailable = new SemaphoreSlim(0, maxObjectCount); 这意味着所有调用Wait的人都将阻塞,而不管他们在哪个线程上。您使用初始计数零初始化信号量: _objectAvailable = new S

为了能够运行在多线程环境中不能很好扩展的库,我创建了一个对象池来自动创建有限数量的实例,以提高总吞吐量。我正在使用
信号量lim
来锁定/解锁对底层实例的访问

为了完整性起见,找到了派生自的
ObjectPool


您使用零的初始计数初始化信号量:

_objectAvailable = new SemaphoreSlim(0, maxObjectCount);

这意味着所有调用
Wait
的人都将阻塞,而不管他们在哪个线程上。

您使用初始计数零初始化信号量:

_objectAvailable = new SemaphoreSlim(0, maxObjectCount);

这意味着所有调用
Wait
的人都将阻塞,无论他们在哪个线程上。

问题在于您将信号量的初始计数设置为零:

_objectAvailable = new SemaphoreSlim(0, maxObjectCount);
这意味着当您调用
GetObject
时,将没有任何可用内容,信号量将超时

你的游泳池一开始是空的,所以你需要先放点东西进去。这将增加信号量计数,也将意味着你有东西要得到


您提到该类在多线程环境中的伸缩性不好,我不确定您的解决方案是否可以工作。您基本上是在等待信号量,然后通过调用基类创建对象。当您正确使用信号量时,最终将有多个线程能够同时调用基类,这意味着基类必须是线程安全的。

问题是您将信号量的初始计数设置为零:

_objectAvailable = new SemaphoreSlim(0, maxObjectCount);
这意味着当您调用
GetObject
时,将没有任何可用内容,信号量将超时

你的游泳池一开始是空的,所以你需要先放点东西进去。这将增加信号量计数,也将意味着你有东西要得到


您提到该类在多线程环境中的伸缩性不好,我不确定您的解决方案是否可以工作。您基本上是在等待信号量,然后通过调用基类创建对象。当您正确使用信号量时,最终将有多个线程能够同时调用基类,这意味着基类必须是线程安全的。

您能给我们展示一些使用池的代码吗?看起来您的池最初是空的,所以,在尝试将对象取出之前,您是否要向其中添加对象?@Sean See更新了问题。如果池中没有可用的实例,则会动态实例化一个新的实例。您可以向我们展示一些使用池的代码吗?看起来您的池最初是空的,所以您是否在尝试将对象取出之前向其中添加对象?@Sean请参阅更新的问题。如果池中没有可用的实例,则会动态实例化一个新实例。这太小了。。。然而如此重要,如此之小。。。你是说
ObjectPool
?因为有一个
ConcurrentBag
我真的不太担心并发性。我应该吗?在我的例子中,非线程安全的对象是泛型
T
。你是说
ObjectPool
?因为有一个
ConcurrentBag
我真的不太担心并发性。我应该吗?在我的例子中,非线程安全的对象是泛型
T