Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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语言中的类服务#_C#_Multithreading_Critical Section_Spool - Fatal编程技术网

C# 如何创建一个;短管;C语言中的类服务#

C# 如何创建一个;短管;C语言中的类服务#,c#,multithreading,critical-section,spool,C#,Multithreading,Critical Section,Spool,我正在研究一种C语言编程。我想我已经很好地理解了面向对象编程,以及运行多线程在高层次上的意义,但实际的实现我已经说过了 我想做的是创建一个工具,该工具将有许多线程独立运行并相互交互,每个线程将服务于自己的任务并可能调用其他线程 我的策略是在每个类上创建一个类似于spool的任务,该任务可以被称为外部任务,并将任务添加到给定的线程,或者为这些线程添加spool服务,以确保通信(在不同线程同时发生多个更新的情况下不会丢失任何内容)。我不确定是否应该将其放在类或外部,让类本身调用spool来执行新任务

我正在研究一种C语言编程。我想我已经很好地理解了面向对象编程,以及运行多线程在高层次上的意义,但实际的实现我已经说过了

我想做的是创建一个工具,该工具将有许多线程独立运行并相互交互,每个线程将服务于自己的任务并可能调用其他线程

我的策略是在每个类上创建一个类似于spool的任务,该任务可以被称为外部任务,并将任务添加到给定的线程,或者为这些线程添加spool服务,以确保通信(在不同线程同时发生多个更新的情况下不会丢失任何内容)。我不确定是否应该将其放在类或外部,让类本身调用spool来执行新任务并跟踪spool。在这里,我特别考虑如果一个空的spool得到一个任务,如何向类发送信号(侦听器方法,这样,如果任务想要在新的东西到达时被唤醒,那么任务可以订阅池),或者使用“如果没有任务,则每X秒检查一次”方法


创建这个的好策略是什么?我应该在实际的类中创建,还是在外部创建?实施中的关键区域是什么,因为“忙等待检查”只允许在添加新作业和删除实际假脱机上的作业,而信令将要求添加/删除作业,但也要求在信令上进行转到睡眠是关键的,这突然增加了一个高要求,即如果关键区域已经进入,该怎么办,因为这可能会导致阻塞,导致其他阻塞,以及可能的不可预见的死锁。

我经常在各种系统上使用这种模型。我为代理定义了一个类,比如“AgentClass”,为请求定义了一个类,比如“RequestClass”。代理有两个抽象方法,“submit(RequestClass*message)”和“signal()”。通常,代理中的线程构造生产者-消费者队列并在其上等待RequestClass实例,submit()方法将传递的RequestClass实例排入队列。RequestClass通常包含一个“command”枚举,告诉代理需要做什么,以及执行请求所需的所有数据和“sender”代理实例。当代理收到请求时,它会打开枚举以调用正确的函数来执行请求。代理仅对RequestClass中的数据进行操作-结果、错误消息等放置在RequestClass的数据成员中。当代理已执行请求(或失败并生成错误数据)时,它可以将()请求提交回发送方(即请求已异步执行),或调用发送方信号()函数,该函数表示发送方正在等待的事件(即请求已同步执行)

我通常在启动时构造固定数量的RequestClass实例,并将它们存储在全局“池”p-C队列中。任何需要发送请求的代理/线程/任何东西都可以将RequestClass实例出列,填写数据,将其提交()给代理,然后异步或同步等待执行请求。完成后,RequestClass将返回到池中。我这样做是为了避免持续的malloc/free/new/dispose,简化调试(我使用计时器将池级别转储到状态栏,因此我总是注意到请求是否泄漏或被双重释放),并且消除了在应用程序关闭时显式终止线程的需要,(如果多个线程只读取/写入应用程序表单以外的数据区域等,那么应用程序将很容易关闭,操作系统可以处理所有线程——有数百篇文章都是关于“应用程序关闭后干净地关闭线程”——我从来都不介意!)

这样的消息传递设计对死锁有很强的抵抗力,因为唯一的锁(如果有的话)在p-C队列中,尽管如果您足够努力,您肯定可以实现它:)

这是你似乎需要的那种系统,还是我弄错了

Rgds,
马丁

哇,我认为这是一个非常开放的问题。关于这类系统(大多称为代理)有很多文章——只是搜索基于代理的系统。是的,直接进入了深层次,试图不下沉。谢谢你的建议。我会调查的。我的目标是一个“模式”,它可以帮助我找到解决这个问题的好方法。一旦我找到了正确的模式,找出实际的实现将是一半的乐趣。我不确定我是否理解你的所有问题,但这个方法在这里可能有用。