Tag: C#的

为什么Monitor.PulseAll会在信号线程中产生“阶梯式”延迟模式?

在一个使用Monitor.PulseAll()进行线程同步的库中,我注意到从调用PulseAll(…)的时间到线程被唤醒的时间似乎都遵循着“阶梯”分布 – 大步骤。 清醒的线程几乎没有工作; 几乎立即回到监视器上等待。 例如,在12个监视器上有24个线程的盒子(2个Xeon5680 / Gulftown;每个处理器6个物理内核;禁用HT),Pulse和一个线程唤醒之间的延迟是这样的: 前12个线程(注意我们有12个内核)需要30到60微秒来响应。 然后我们开始变得非常大跳跃; 高原大约在700,1300,1900和2600微秒。 使用下面的代码,我能够独立于第三方库成功重新创build此行为。 这段代码所做的是启动大量的线程(改变numThreads参数),这些线程只是在监视器上等待,读取一个时间戳,logging到一个ConcurrentSet,然后立即返回到Waiting。 一旦第二个PulseAll()唤醒了所有的线程。 它执行了这20次,并将第10次迭代的延迟报告给控制台。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Collections.Concurrent; using System.Diagnostics; namespace PulseAllTest { class Program { static long LastTimestamp; static long Iteration; static object SyncObj = new object(); static Stopwatch s = new Stopwatch(); […]

实现可重试块的正确完成

Teaser :伙计们,这个问题不是关于如何实施重试策略的。 这是关于正确完成TPL数据stream块。 这个问题主要是我以前的问题在ITargetBlock内重试策略的延续 。 这个问题的答案是@ svick利用TransformBlock (source)和TransformManyBlock (target)的智能解决scheme。 剩下的唯一问题就是以正确的方式完成这个块:等待所有的重试先完成,然后完成目标块。 这就是我最终的结果(这只是一个片段,不要太注意非线程安全的retries集): var retries = new HashSet<RetryingMessage<TInput>>(); TransformManyBlock<RetryableMessage<TInput>, TOutput> target = null; target = new TransformManyBlock<RetryableMessage<TInput>, TOutput>( async message => { try { var result = new[] { await transform(message.Data) }; retries.Remove(message); return result; } catch (Exception ex) { message.Exceptions.Add(ex); if (message.RetriesRemaining == 0) { if […]

是否有文档描述Clang如何处理过多的浮点精度?

当允许使用的唯一的浮点指令是387时,几乎不可能(*)以合理的成本提供严格的IEEE 754语义。 当希望保持FPU工作在完整的64位有效位上时,这是特别困难的,所以long double精度型可用于扩展精度。 通常的“解决scheme”是以唯一可用的精度进行中间计算,并在或多或less明确定义的情况下将其转换为较低的精度。 最近的GCC版本根据Joseph S. Myers在2008年发布的GCC邮件列表中的解释,处理了中间计算中的超额精度。 就我所知,这个描述使得一个程序编译成gcc -std=c99 -mno-sse2 -mfpmath=387完全可以预测的。 如果偶然的话,它不是,这是一个错误,它将是固定的:Joseph S. Myers在他的文章中表示的意图是使其可预测。 是否logging了Clang如何处理过度的精度(比如使用选项-mno-sse2 )以及在哪里? (*)编辑:这是一个夸张。 当允许将x87 FPUconfiguration为使用53位有效位时,它会稍微令人烦恼,但是仿真二进制64 并不困难 。 在下面的R ..的评论之后,下面是我和Clang最近版本的简短交互的日志: Hexa:~ $ clang -v Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn) Target: x86_64-apple-darwin12.4.0 Thread model: posix Hexa:~ $ cat fem.c #include <stdio.h> #include <math.h> #include <float.h> #include <fenv.h> double […]

如何使用智能指针协变返回types?

我有这样的代码: class RetInterface {…} class Ret1: public RetInterface {…} class AInterface { public: virtual boost::shared_ptr<RetInterface> get_r() const = 0; … }; class A1: public AInterface { public: boost::shared_ptr<Ret1> get_r() const {…} … }; 这段代码不能编译。 在视觉工作室,它引发了 C2555:重写虚函数返回types不同,并且不是协变的 如果我不使用boost::shared_ptr但返回原始指针,代码编译(我明白这是由于在C ++ 协变返回types )。 我可以看到问题是因为Ret1 boost::shared_ptr不是从RetInterface boost::shared_ptr RetInterface 。 但是我想返回Ret1 boost::shared_ptr以供其他类使用,否则我必须在返回后Ret1返回值。 难道我做错了什么? 如果没有,为什么这样的语言 – 在这种情况下,应该可以扩展处理智能指针之间的转换? 有没有一个理想的解决方法?

将基于callback的asynchronous方法转换为等待任务的最佳方法

转换/包装使用callback的“经典”asynchronous方法返回(可等待的)任务的最佳方法是什么? 例如,给出以下方法: public void GetStringFromUrl(string url, Action<string> onCompleted); 我知道把这个包装成一个返回任务的方法的唯一方法是: public Task<string> GetStringFromUrl(string url) { var t = new TaskCompletionSource<string>(); GetStringFromUrl(url, s => t.TrySetResult(s)); return t.Task; } 这是完成这个的唯一方法吗? 有没有一种方法可以将调用包装到任务本身的GetStringFromUrl(url,callback)中(即调用本身将在任务内运行而不是同步)

C和C ++中的Const正确性

我明白const的正确性意味着什么,我的问题不在于const的正确性是什么。 所以我不期待解释或C ++ – FAQ的链接。 我的问题是: C中的const和C ++中的const之间的语义差异是什么? 和 造成这种差别的原因是什么? 从各自的标准,使差异明确的行情将是很好的。 我经常在C和C ++之间切换,我想知道在这样做的时候应该牢记的重点。 我似乎不记得这些原因(特别感谢,如果你能提供一个推理),但从我的头脑,我可以记得: C ++中的constvariables默认有内部链接,而C中有默认的外部链接; const对象可以在C ++中用作编译时间值,但不能用作C中的编译时间值; 指向string的指针必须是C ++中的char const* ,但在C中,它可以是char* 。 我错过了什么?

在f(x)中,x可以在f之前被评估吗?

我有一个C ++程序。 这个程序做这样的事情: struct MyT {void memfunc(std::unique_ptr<MyT> arg);}; std::unique_ptr<MyT> obj = /* some init */; obj->memfunc(std::move(obj)); 这是保证是有效的,或者我可以最终调用nullptr成员函数? 标准报价适用。 我知道参数的评估顺序是不确定的,但是我不记得顺序是如何调用函数对象的。

如果一个“实用程序”类是邪恶的,我在哪里把我的通用代码?

我通常遵循全局variables/函数是邪恶的规则,并且每一段代码都应该存在于它所属的类中。 这是一条非常简单的规则,我相信直到现在我还没有遇到这个规则的问题。 然而,今天,我需要为我的程序集添加一个函数,而不是添加到特定的类。 也就是说,几乎所有的类都可以用于这个特定的function。 我应该在哪里放置这个function(+1重载)? 如果我把它放在“公用事业”课上,我觉得很肮脏。 如果我把它贴到一个半相关的class上,让其他class直接打电话给我,我感觉更糟。 这段代码基本上把一个IList<PointF>切成一个规范化列表。 我现在觉得把它作为IList<PointF>的扩展方法可能是最好的select…

Visual Studio 2015中的C#格式更改了吗? 我怎样才能改回来?

在过去的Visual Studio版本中,我可以在C#中创build一个单行自动属性,如下所示: public int Whatever { get; set; } 如果我点击Control-K,Control-D进行格式化,则属性将保持这种状态。 但是在Visual Studio 2015 RC中,当我键入属性时,它会打包,即使我打开它,格式化也会重新包装它: public int Whatever { get; set; } 我也注意到它与构造函数。 在过去,一个空的构造函数(例如刚才调用的基类构造函数)可能如下所示: public Whatever(int stuff) : base(stuff) { } 现在Visual Studio 2015坚持这样做: public Whatever(int stuff) : base(stuff) { } 别人注意到了吗? 这是在Visual Studio 2015中进行的更改吗? 如果是这样,有什么办法可以改变它? 我查看了“工具”>“选项”的C#格式部分,但找不到可能会影响到这一点的任何新设置。 (我的插件之一导致它不是不可能的,但我没有发现任何明显的罪魁祸首。) (为什么要关心呢?因为当我使用Collapse to Definitions概述命令时,单行属性和构造函数保持原样,而包含的元素会崩溃。如果它们被折叠,我不能一眼就看出它们是空的;我必须把它们切换到非崩溃状态才能看到没有任何东西。)

是否返回语句复制值

我想知道这是因为范围问题。 例如,考虑代码 typedef struct { int x1;/*top*/ int x2;/*bottom*/ int id; } subline_t; subline_t subline(int x1, int x2, int id) { subline_t t = { x1, x2, id }; return t; } int main(){ subline_t line = subline(0,0,0); //is line garbage or isn't it? the reference //to subline_t t goes out of scope, so the […]