小编180*_*ION的帖子

如何解决numeric_limits <T> :: min()的不一致定义?

numeric_limits特性应该是获得各种类型信息的一般方式,能够做到这样的事情

template<typename T>
T min(const std::vector<T>& vect)
{
    T val = std::numeric_limits<T>::min();

    for(int i=0 ; i<vect.size() ; i++)
        val = max(T, vect[i]);

    return val;
}
Run Code Online (Sandbox Code Playgroud)

问题是(至少使用MS Visual Studio 2008)numeric_limits <int> :: min()返回最小的负数,而numeric_limits <double> :: min()返回最小的数!

谁知道这个设计背后的理性呢?是否有更好的(推荐?)方式使用numeric_limits?在我上面的具体功能中,我当然可以将T初始化为vect [0],但这不是我要找的答案.

又见(浮点专用)的讨论 在这里

c++ standard-library

12
推荐指数
3
解决办法
4242
查看次数

ISupportErrorInfo的实现 - 这是什么意思?

什么是ISupportErrorInfo接口是什么意思?我理解它有点不知所措.来自MSDN:

此接口可确保错误信息可以正确地在调用链中传播.使用错误处理接口的自动化对象必须实现ISupportErrorInfo.

此方法指示接口是否支持IErrorInfo接口.

HRESULT InterfaceSupportsErrorInfo(
  REFIID riid
);
Run Code Online (Sandbox Code Playgroud)

返回S_OK意味着什么InterfaceSupportsErrorInfo?你应该为所有接口返回S_OK吗?一些?

com error-handling

11
推荐指数
1
解决办法
3360
查看次数

C++中的定点组合子

我对使用定点组合器的实际例子很感兴趣(例如C++中的y-combinator.你有没有使用带有egg的固定点组合器或绑定真实的实时代码?

我在蛋中发现这个例子有点密集:

void egg_example()
{
    using bll::_1;
    using bll::_2;

    int r =
        fix2(
            bll::ret<int>(
                // \(f,a) -> a == 0 ? 1 : a * f(a-1)
                bll::if_then_else_return( _2 == 0,
                    1,
                    _2 * lazy(_1)(_2 - 1)
                )
            )
        ) (5);

    BOOST_CHECK(r == 5*4*3*2*1);
}
Run Code Online (Sandbox Code Playgroud)

你能解释一下这一切是怎么回事吗?

是否有一个很好的简单例子,或许使用bind可能比这个更少的依赖?

c++ bind y-combinator

10
推荐指数
2
解决办法
6078
查看次数

增强线程中的虚假解除阻塞

我今天在Boost线程文档中遇到了这个有趣的段落:

void wait(boost::unique_lock<boost::mutex>& lock)
Run Code Online (Sandbox Code Playgroud)

...

效果:原子调用lock.unlock()并阻止当前线程.当通过调用this-> notify_one()或this-> notify_all()或虚假地通知时,线程将解除阻塞.当线程被解除阻塞(无论出于何种原因)时,通过在等待调用返回之前调用lock.lock()来重新获取锁.如果函数以异常退出,则还可以通过调用lock.lock()来重新获取锁.

所以我感兴趣的是"虚假地"这个词的含义.为什么线程会因为虚假原因而被解除阻塞?可以做些什么来解决这个问题?

multithreading boost wait conditional-statements

10
推荐指数
1
解决办法
2665
查看次数

用于执行具有不同优先级的任意任务的线程池

我正在尝试为我的工作设计一个具有很多设计要求的线程池.这对于工作软件来说是一个真正的问题,这是一项艰巨的任务.我有一个有效的实现,但我想把它扔到SO,看看人们可以提出什么有趣的想法,以便我可以比较我的实现,看看它是如何叠加的.我试图尽可能地满足要求.

线程池需要执行一系列任务.任务可以是短时间运行(<1秒)或长时间运行(数小时或数天).每个任务都有一个相关的优先级(从1 =非常低到5 =非常高).任务可以在其他任务运行时随时到达,因此当它们到达时,线程池需要选择这些并在线程可用时安排它们.

任务优先级完全独立于任务长度.实际上,如果不运行任务就无法确定任务可以运行多长时间.

某些任务受CPU限制,而有些任务受IO限制.事先不可能知道给定的任务是什么(虽然我猜在任务运行时可能会检测到).

线程池的主要目标是最大化吞吐量.线程池应该有效地使用计算机的资源.理想情况下,对于CPU绑定任务,活动线程的数量将等于CPU的数量.对于IO绑定任务,应分配比CPU更多的线程,以便阻塞不会过度影响吞吐量.最大限度地减少锁的使用和使用线程安全/快速容器非常重要.

通常,您应该以更高的CPU优先级运行更高优先级的任务(参考:SetThreadPriority).较低优先级的任务不应"阻止"更高优先级的任务运行,因此如果在所有低优先级任务运行时出现更高优先级的任务,则优先级较高的任务将运行.

任务具有与其关联的"最大运行任务"参数.每种类型的任务只允许一次最多运行该任务的许多并发实例.例如,我们可能在队列中有以下任务:

  • A - 1000个实例 - 低优先级 - 最大任务1
  • B - 1000个实例 - 低优先级 - 最大任务1
  • C - 1000个实例 - 低优先级 - 最大任务1

工作实现只能同时运行(最多)1 A,1 B和1 C.

它需要在Windows XP,Server 2003,Vista和Server 2008(最新的服务包)上运行.


作为参考,我们可能会使用以下界面:

namespace ThreadPool
{
    class Task
    {
    public:
        Task();     
        void run();
    };

    class ThreadPool
    {    
    public:
        ThreadPool();
        ~ThreadPool();

        void run(Task *inst);
        void stop();
    };
}
Run Code Online (Sandbox Code Playgroud)

c++ windows multithreading

9
推荐指数
1
解决办法
2466
查看次数

当我的文字显示为问号时,这是什么意思?

我正在尝试使用(例如)Windows GDI在我的程序中显示一些文本,并且一些unicode字符显示为问号?怎么了?

另请参阅:当我的文本显示为方框时,这意味着什么?

unicode fonts text

9
推荐指数
1
解决办法
1万
查看次数

如何更改线程的名称

我有一个使用"很多"线程的服务器应用程序.如果不想进入有关它应该使用多少线程的争论,那么能够在调试器"线程"窗口中看到描述每个线程的一些描述性文本,而不必点击它,从上下文确定它是什么.

它们都具有相同的起始地址,因此通常线程窗口会显示类似"thread_base :: start"或类似内容的内容.我想知道是否有API调用或允许我自定义该文本的东西.

c++ winapi multithreading

9
推荐指数
2
解决办法
3915
查看次数

与异步方法有关的VoidTaskResult类型是什么?

我最近第一次使用异步(和.Net 4.5),我遇到了让我难过的东西.关于我可以在网上找到的VoidTaskResult类的信息不多,所以我来到这里是为了看看是否有任何关于发生了什么的想法.

我的代码如下所示.显然,这很简单.基本思想是调用异步的插件方法.如果它们返回Task,则异步调用没有返回值.如果他们返回Task <>,那么就有了.我们事先不知道它们是哪种类型,因此我们的想法是使用反射查看结果的类型(如果类型为Type <>,则IsGenericType为true)并使用动态类型获取值.

在我的真实代码中,我通过反射调用插件方法.我认为这不应该对我所看到的行为产生影响.

// plugin method
public Task yada()
{
 // stuff
}

public async void doYada()
{
  Task task = yada();
  await task;

  if (task.GetType().IsGenericType)
  {
    dynamic dynTask = task;
    object result = dynTask.Result;
    // do something with result
  }
}
Run Code Online (Sandbox Code Playgroud)

这适用于上面显示的插件方法.IsGenericType为false(正如预期的那样).

但是,如果稍微更改插件方法的声明,IsGenericType现在返回true并且东西中断:

public async Task yada()
{
 // stuff
}
Run Code Online (Sandbox Code Playgroud)

执行此操作时,行上会抛出以下异常(object result = dynTask.Result;):

RuntimeBinderException

如果你深入研究任务对象,它实际上似乎是类型.VoidTaskResult是线程名称空间中的私有类型,几乎没有任何内容.

VoidTaskResult任务

我尝试更改我的调用代码:

public async void doYada()
{
  Task task = yada();
  await task;

  if (task.GetType().IsGenericType)
  {
    object result = task.GetType().GetProperty("Result").GetMethod.Invoke(task, new …
Run Code Online (Sandbox Code Playgroud)

c# reflection asynchronous dynamic

9
推荐指数
1
解决办法
1257
查看次数

COINIT_SPEED_OVER_MEMORY有什么作用?

调用时CoInitializeEx,您可以为以下值指定以下值dwCoInit:

typedef enum tagCOINIT {
    COINIT_MULTITHREADED     = 0x0,
    COINIT_APARTMENTTHREADED = 0x2,
    COINIT_DISABLE_OLE1DDE   = 0x4,
    COINIT_SPEED_OVER_MEMORY = 0x8,
} COINIT;
Run Code Online (Sandbox Code Playgroud)

具有暗示性的"速度超过记忆"价值的作用是什么?这些天在COM中被忽略了吗?

com

8
推荐指数
1
解决办法
1592
查看次数

使用XDocument更改XML的顺序

我想使用XDocument更改XML的顺序

<root>
  <one>1</one>
  <two>2</two>
</root>
Run Code Online (Sandbox Code Playgroud)

我想更改顺序,以便2出现在1之前.这个功能是否已经完成,或者我必须自己完成.例如,删除AddBeforeSelf()?

谢谢

.net c# linq linq-to-xml

8
推荐指数
2
解决办法
7356
查看次数