小编Chu*_*huu的帖子

有没有办法禁用从UInt32到char的隐式转换?

我正在处理代码,该代码将特定协议定义的大量ascii文本作为输入.原作者将原始协议中的"string(1)"数据类型解释为代码中的字符.

在角落的情况下有很多微妙的错误,你有代码,如:

char theChar = whatever();
if(theChar == 7) {...} 
Run Code Online (Sandbox Code Playgroud)

真正的意思是:

if(theChar == '7') {...}
Run Code Online (Sandbox Code Playgroud)

为了尝试一次捕获所有这些,有没有办法禁用隐式转换为'char'?如果没有,那么追踪所有这些的最佳方法是什么?

c# implicit-cast

7
推荐指数
1
解决办法
1106
查看次数

混合锁和联锁操作是否安全?

我有一些必须是线程安全的代码,其行为类似于:


protected long m_RunningValue
protected long m_RunningCounter
protected object m_Lock = new object();

public long RunningValue { get { return Interlocked.Read(m_RunningValue); } }
public long RunningCounter { get { return Interlocked.Read(m_RunningCounter); } }

public void DoCalculation(int newValue, int newQuantity)
{
   lock(m_Lock)
   {
       Interlocked.Add(ref m_RunningValueA, newValue);
       Interlocked.Add(ref m_RunningCounter, newQuantity);
       if(Interlocked.Read(ref newQuantity) == 0)
       { 
         ...m_RunningValue gets further modified here
       }
   }
}

计算必须锁定值和计数器,否则竞争条件可能影响if(...)块,但是在读出时它们根本不需要同步,即如果计数器和值在尝试之间发生变化读两个,这对我来说是100%的好.

读取时的互锁用于读取64位值的线程安全性.

  1. 混合联锁和锁这样安全吗?我在其他网页上看到混合它们是不安全的,但是如果这意味着混合它们是引入细微错误的好方法,或者如果在系统级别这会破坏所涉及的数据结构,我无法找到澄清.

  2. 所有这些互锁(64位.NET 4.0运行时)的成本是否完全违背了在属性get()方法周围保存ReaderWriterSlim锁的目的?

c# interlocked thread-safety readerwriterlockslim

6
推荐指数
1
解决办法
1418
查看次数

在C#中实现高分辨率DateTime.UtcNow的最佳方法?

我正在尝试实施时间服务,报告时间的准确性超过1毫秒.我认为一个简单的解决方案是进行初始测量并使用StopWatch为其添加增量.问题是这种方法似乎与墙壁时间相差很快.例如,以下代码尝试测量Wall Time和我的高分辨率时钟之间的差异:

public static void Main(string[] args)
{
    System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
    DateTime baseDateTime = DateTime.UtcNow;
    s.Start();
    long counter = 0;
    while(true)
    {
        DateTime utcnow = DateTime.UtcNow;
        DateTime hpcutcnow = baseDateTime + s.Elapsed;
        Console.WriteLine(String.Format("{0}) DT:{1} HP:{2} DIFF:{3}", 
            ++counter, utcnow, hpcutcnow, utcnow - hpcutcnow));
        Thread.Sleep(1000);
    }
}
Run Code Online (Sandbox Code Playgroud)

在相当近期的服务器硬件上,我以大约2毫秒/分钟的速度发散.

窗户中是否还有其他时间设施我不知道会更准确?如果没有,是否有更好的方法来创建我应该使用的高分辨率时钟或第三方库?

c# time stopwatch

6
推荐指数
1
解决办法
1623
查看次数

使用由google的protobuf序列化的protobuf-net反序列化数据的问题

我目前正在处理在一个应用程序(C++)中序列化的代码,并需要在另一个应用程序(C#)中反序列化它.我正在尝试使用谷歌proto + protobuf-net,但有些事情失败了.

.cc和.cs消息定义文件都是使用它们各自的编译器从同一个.proto文件生成的.

数据通过UDP发送,消息(~40B)很容易适合单个数据报.

在C++大小上,boost :: asio用于传输数据,相关代码为:

ProtocolBufferdata data;
...
boost::asio::streambuf b;
std::ostream os(&b);
data.SerializeToOstream(&os);
m_Socket.send_to(b.data(), m_Endpoint);
Run Code Online (Sandbox Code Playgroud)

我很确定这是正常的,因为使用wireshark我至少可以看到我期望在数据报中的所有字符串.在C#端,使用Begin/End接收,我们在回调中有以下内容:

byte[] buffer ....        

public void ReceiveData(IAsyncResult iar)
{
    try
    {
        Socket remote = (Socket)iar.AsyncState;
        int recv = remote.EndReceive(iar);
        using (MemoryStream memStream = new MemoryStream())
        {
            memStream.Write(buffer, 0, recv);
            ProtoData data = ProtoBuf.Serializer.Deserialize<ProtoData >(memStream);
            onReceive(data);
        }
    }
    catch (Exception ex)
    {
        ...
    }
    finally
    {
        socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveData), socket);
    }
}
Run Code Online (Sandbox Code Playgroud)

缓冲区确实具有预期的字节数,并具有告警字符串.protobuf-net容器具有所有默认值.

我对这里发生的事情感到有些困惑,并且几乎不可能将调试器附加到客户端应用程序,因为它被部署为另一个与远程调试器不兼容的应用程序的插件.我很感激任何建议,这让我很难过.

c# c++ serialization cross-platform protobuf-net

5
推荐指数
1
解决办法
3057
查看次数

有什么方法可以在更新SVN外部时触发构建?

我目前有一个项目,其中包括大量的外部,需要在外部更新时重建,以保持文物新鲜.只有在分支本身进行更改时,我无法找到在外部更改时触发svn构建的方法.

是否有TeamCity的某些功能可以执行此操作,如果没有,添加此构建触发器的最佳方法是什么?

svn teamcity build-triggers

5
推荐指数
1
解决办法
939
查看次数

List <T>与一个Writer,No Enumerators的线程安全性

在查看一些与此问题无关的错误的数据库代码时,我注意到在某些地方List<T>使用不当.特别:

  1. 有许多线程同时访问List作为读者,但使用索引list的,而不是enumerators.
  2. 有一位作家list.
  3. 没有同步,读者和编写者同时访问list,但由于代码结构,在执行返回的方法之前永远不会访问最后一个元素Add().
  4. 没有任何元素被删除list.

通过C#文档,这不应该是线程安全的.但它从未失败过.我想知道,因为具体实施的,List(我在内部假定它是一个数组重新allocs当它运行的空间),它的1-作家0枚举正阅读器插件唯一的方案偶然线程安全的,或者是否有一些不太可能的情况,这可能会在当前的.NET4实现中爆炸

编辑:重要细节我遗漏了阅读一些回复.读者将List其内容视为只读.

c# list thread-safety concurrent-programming

5
推荐指数
1
解决办法
742
查看次数

对于最近版本的.NET中基本操作的成本是否有很好的参考?

很久以前(2003年),CLR Performance Team发表了一篇由Jan Gray撰写的文章,名为" 编写更快的托管代码:知道什么是成本 ".在撰写本文之后的十年中,.NET已经增加了许多基本操作; 我确信自从CLR的最初版本发布以来,文章中引用的许多基本操作的性能都发生了变化.

是否有一个很好的参考,已经更新了CLR的最新版本的基本操作的性能测量?

.net clr performance

5
推荐指数
1
解决办法
103
查看次数

在 C++ 中将大型无符号浮点数四舍五入为整数的最佳方法是什么?

我需要使用标准的“math.h”中点舍入行为将 64 位双精度值舍入到我的代码中最接近的 uint64_t。其中一些数字具有以下属性:

  • 大于 LLONG_MAX
  • 小于或等于 ULLONG_MAX

我注意到标准库舍入函数没有“未签名”版本。另外,我怀疑当中间双精度值太大而无法放入尾数时,人们用来执行此操作的一些技巧将不再起作用。

进行这种转换的最佳方法是什么?

c++ rounding

5
推荐指数
1
解决办法
170
查看次数

LucidDB项目有多健康?

我正在开发一个项目,该项目将从后端的列存储数据库中获益.我被LucidDB所吸引,因为功能设置似乎很完美,在项目显示价值之前,我无法承担Infobright或Vertica等商业解决方案的成本.

问题是,我担心LucidDB项目的健康状况.内部维基在一个多月内没有更新,网站上有很多破损的链接.DynamoBI死亡并没有帮助.

是否有人知道项目的状态,以及您对依赖此数据库的生产代码的满意程度如何?

database

4
推荐指数
1
解决办法
1981
查看次数

在 C++ 中样板化“cold/never_inline”错误处理技术的最佳方法是什么?

文章中,一种技术被描述为在移动的gcc错误代码外的线,以帮助优化尺寸为热路径尽可能。这方面的一个例子是:

#define unlikely(x)  __builtin_expect (!!(x), 0)

bool testForTerriblyUnlikelyEdgeCase() {
  //test for error condition here
}

void example() {
  if (unlikely(testForTerriblyUnlikelyEdgeCase())) {
    [&]() __attribute__((noinline,cold)) {
       //error handling code here
    }();
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一项很棒的技术,但需要大量的样板文件。包装它以尽可能减少样板的最佳方法是什么?理想情况下 C++14 兼容允许特定于 gcc 的功能。

额外问题: if 语句中的不太可能(...) 是否多余,因为 lambda 被显式标记为冷?

c++ macros gcc

4
推荐指数
1
解决办法
346
查看次数