小编jav*_*red的帖子

使用try-finally只是为了确保在方法完成时执行某些操作?

我的方法返回很多点.我在执行期间也在许多方面构造newData.无论我返回哪里,我都需要保存并存储构造结果.不要错过"返回"我只是用try-finally块包围代码,所以现在我确定将存储newData.

List<X> newData = new List<X>();
try
{
    ....
    update newData
    .....
    return;
    .....
    ....
    update newData
    ....
    update newData
    return;
    .....
    return;
} finally
{
    // copy newData to data    
}
Run Code Online (Sandbox Code Playgroud)

但我没有发现任何异常,并且此代码不适用于异常.一般来说是否可以接受,或者你可以提出另一种更好的方法

c#

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

防止方法同时从不同的线程执行

我是否纠正了阻止方法同时执行两次的唯一方法是使用lock语句?

private object lockMethod = new object();

public void Method() {
    lock (lockMethod) {
        // work
    }
}

public void FromThread1() {
    Method();
}

public void FromThread2() {
    Method();
}
Run Code Online (Sandbox Code Playgroud)

当然我也可以使用MethodImpl(MethodImplOptions.Synchronized)几乎相同的东西.

还有其他技术吗?

c#

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

在HFT中尝试并行订单处理是否有意义?

我认为对于那些熟悉hft的人来说,这是一个更理论性的问题.我收到FAST的订单并处理它们.我每秒收到大约2-3千个订单.问题是我是否应该尝试同步或异步处理它们.

每次收到下一个订单时,我都需要做以下事情:

  • 更新相应仪器的订单
  • 更新依赖于该订单的索引和指标
  • 更新策略并根据需要安排一些操作(买/卖东西等)

要做同步,我有大约200-300μs(能够每秒处理3000个订单).我认为这应该足够了.

只是计划异步任务我花了大约30μs

利弊:

同步:

  • ++不需要同步事物!
  • "收到订单"和"采取行动"之间的延迟较少,因为不需要安排任务或将数据/工作传递给另一个进程(在hft中非常重要!).
  • - 但是"接收到订单"操作可能会延迟,因为我们可以在套接字缓冲区中等待等待先前的订单处理

异步:

  • ++使用现代服务器的能力(例如我的服务器有24个核心)
  • ++在某些情况下更快,因为在处理上一条消息时不要等待.
  • ++可以处理更多消息,或者可以为每条消息执行更复杂的操作
  • - 需要同步很多可以减慢程序的东西

同步示例:我们收到更新的MSFT订单,然后更新INTC订单并在不同的线程中处理它们.在这两种情况下,我们都会触发NASDAQ指数重新计算.因此纳斯达克指数的计算应该是同步的.然而,这个特殊问题可以解决以避免同步......这只是可能同步的一个例子.

所以问题是我应该处理同步或异步的订单更新.到目前为止,我处理它们异步,我有每个仪器的专用线程.因为我可以处理针对不同仪器更新的异步两个(MSFT和INTC),但是应该同步处理一个仪器(MSFT)的两个更新.

c# fix-protocol hft

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

我应该*始终*同步访问从多个线程使用的所有双字段/属性/变量?

注意我倾向于编写无锁代码,所以我尽可能避免任何类型的锁.相反,我只是使用while(true)循环,因为我有很多CPU功率.

根据http://msdn.microsoft.com/en-us/library/aa691278%28VS.71%29.aspx double变量更新不是原子的.

我关心两个问题:

  • 如果一个线程修改字段或属性的变量,而另一个线程读取它在同一时间,我想要么以前的或新的价值,但我不希望收到一些奇怪的事情.即如果一个线程从5.5更改为15.15我希望在另一个线程中有这两个数字中的一个,但不是5.15或15.5或其他任何东西.
  • 如果一个线程已经更新了值,另一个线程在此之后读取它我想要接收最新的,最新的值.我认为volatile关键字可以帮助解决这个问题,但似乎不能,因为"Volatile不能保证值的新鲜度.它会阻止一些优化,但不能保证线程同步." 如上所述是c#原始数组volatile?

问题:

  • 我是否正确,如果没有同步,可能会出现这两个问题?
  • 如果你能给我一些简短的例子,证明没有同步它就行不通 - 那会很好
  • 我应该如何访问双字段或变量或属性以始终具有真正的最新值?"同步"会保证"新鲜度"吗?最快的方法是什么?什么螺旋锁?

目前我在我的程序中使用了很多doubledecimal变量/字段/属性,几乎每个都工作正常,所以我真的很困惑,因为我从不同的线程访问它们没有任何同步,这只是工作...但现在我在想可能最好用float"内置同步化"

c# synchronization

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

当我需要一些项目时,我应该只使用它的"int id"吗?

我的应用程序InstrumentFactory- 我创建Instrument实例的唯一地方.每个仪器实例都包含多个字段,例如Ticker=MSFTGateId=1,也是唯一的Id =1.

现在我意识到我几乎从不需要Instrument实例.在我需要的90%的情况下Id.例如,现在我有这样的方法:

public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
    return instrumentInfos[instrument.Id];
}
Run Code Online (Sandbox Code Playgroud)

我们知道我们不应该传递比所需更多信息的参数.所以这段代码可能应该重构为:

public InstrumentInfo GetInstrumentInfo(int instrumentId)
{
    return instrumentInfos[instrumentId];
}
Run Code Online (Sandbox Code Playgroud)

我现在可以重构90%的代码instrumentId而不是使用Instrument.

我应该这样做吗?改变无处不在Instrument,以instrumentId将它作为一个硬性要求(每个仪表应该有且仅有一个唯一的ID).但是我会有什么好处?作为"硬性要求"的回报,我想为此获得一些好处......(速度,可读性?)但我没有看到它们.

c# oop

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

如何重新排序已排序的数组,其中一个元素更新

我有恒定大小的数组(现实生活中的大小 = 20),允许重复例如:

1 2 2 3 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

现在只有一个元素更新:

1 5 2 3 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

我需要使用这个数组。我应该只使用冒泡排序吗?

更新我不知道如何称呼我写的东西。但我想不可能更快地排序。欢迎评论!

    // array is already almost sorted and INCREASING, element at pos need to be inserted to the right place
    private void SortQuotes(List<Quote> quoteList, int pos)
    {
        var quoteToMove = quoteList[pos];
        if (pos == 0 || quoteList[pos - 1].Price < quoteToMove.Price)
        {
            MoveElementsDown(quoteList, pos);
        } else if (pos == quoteList.Count - 1 …
Run Code Online (Sandbox Code Playgroud)

java sorting algorithm

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

"virtual void IBase :: Foo"和"virtual void Foo"之间有什么区别?

我使用了VisualAssistX Implement Virtual Methods选项,它生成了:

class Base: public IBase
{
public:
    Base(void);
    ~Base(void);
    virtual void IBase::Foo();
Run Code Online (Sandbox Code Playgroud)

我注意到我可以省略IBase并编程仍然编译如下:

    virtual void Foo();
Run Code Online (Sandbox Code Playgroud)

如果这是相同的代码?为什么VisualAssistX会插入IBase::?是否只是提高可读性的"代码风格"?

谢谢

c++ visual-c++

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

具有“阻塞”pop 的单生产者单消费者队列

我正在寻找具有“阻塞”弹出功能的单生产者单消费者队列。除了一种方法外,提升spsc_queue几乎没问题:

bool pop(T & ret);
Pops one object from ringbuffer.
Run Code Online (Sandbox Code Playgroud)

这个方法是“非阻塞的”,如果没有数据就立即返回。我希望这个方法“阻塞”并等待一些数据到达。

我应该使用哪些集合?

upd至少有人可以建议任何带有阻塞流行音乐的 C++ 队列吗?

c++ multithreading c++11

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

gcc -Ofast - 完整的限制列表

-Ofast在我的程序中使用gcc选项导致延迟要求.我写了简单的测试程序:

#include <iostream>
#include <math.h>

static double quiet_NaN = std::numeric_limits<double>::quiet_NaN();

int main()
{
    double newValue = 130000; 
    double curValue = quiet_NaN; 
    printf("newValue = %f\n", newValue); 
    printf("curValue = %f\n", curValue); 
    printf("isnan(newValue) = %d\n", isnan(newValue)); 
    printf("isnan(curValue) = %d\n", isnan(curValue)); 
    printf("newValue == curValue %d\n", (newValue == curValue)); 
    printf("newValue != curValue %d\n", (newValue != curValue)); 
}
Run Code Online (Sandbox Code Playgroud)

我试图用默认标志和-Ofast运行它:

$ g++ TestPointer.cpp 
$./a.out 
newValue = 130000.000000
curValue = nan
isnan(newValue) = 0
isnan(curValue) = 1
newValue == curValue 0
newValue != curValue 1

$ …
Run Code Online (Sandbox Code Playgroud)

c++ gcc fast-math

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

Eclipse:如何遍历某个文件夹中的所有文件

我有一些org.eclipse.core.resources.IFolder我需要遍历这个文件夹中的所有文件.(我还需要为每个文件做一些SAX事情,但我不想加载EMF模型,因为它太慢了)

获取此文件夹和子文件夹中所有文件列表的最佳方法是什么?

eclipse

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