小编Tom*_*Tom的帖子

TCP服务器w/boost :: asio,线程池与无堆栈协程的可伸缩性

我正在构建一个基于TCP的守护进程,用于HTTP请求的预处理/后处理.客户端将连接到Apache HTTPD(或IIS),并且自定义Apache/IIS模块将请求转发到我的TCP守护程序以进行进一步处理.我的守护进程需要向上扩展(但不能向外)以处理大量流量,并且大多数请求都是小而短暂的.守护进程将使用C++构建,并且必须是跨平台的.

我目前正在研究增强的asio库,这看起来很自然.但是,我无法理解无堆栈协程与线程池模式的优点.具体来说,我在这里看HTTP服务器示例#3和HTTP服务器示例#4:http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/examples.html

尽管我所有的谷歌搜索,我都无法完全理解无堆栈协程服务器的优点,以及它如何相对于多核系统上的线程池服务器执行.

鉴于我的要求,两者中哪一个最合适?为什么?请随意"愚弄"你关于无堆叠协程想法的答案,我仍然在这里摇摇欲坠.谢谢!

编辑:另一个随机思考/关注讨论:Boost HTTP服务器示例#4被描述为" 使用无堆栈协程实现的单线程HTTP服务器 ".好的,所以它完全是单线程的(对吧?即使在父进程'分叉'给孩子之后?参见示例#4中的server.cpp)...单线程会成为多核系统的瓶颈吗?我假设任何阻塞操作都会阻止所有其他请求执行.如果确实如此,为了最大化吞吐量,我正在考虑基于协程的接收数据异步事件,我的内部阻塞任务的线程池(利用多核),然后是异步发送和关闭连接机制.同样,可扩展性至关重要.有什么想法吗?

c++ multithreading boost coroutine boost-asio

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

C++ 11正则表达式堆栈溢出/ VS2012

我正在将一些旧的Boost正则表达式代码转换为C++ 11,我偶然发现了一个测试用例的问题.这是一个使用std :: regex导致堆栈溢出异常的场景,但与boost :: regex一起工作正常.我没有改变正则表达式模式,并且验证了模式是我想要的.看来这个特定的字符串输入片段导致堆栈溢出.使用VS2012,x64调试版本:

std::regex regx( "(^|\\})(([^\\{:])+:)+([^\\{]*\\{)" );

    const std::string testinput = " COLOR: #000; BACKGROUND-COLOR: #FFF; FONT-FAMILY: VERDANA, ARIAL, HELVETICA, SANS-SERIF; BACKGROUND:URL(URL(___FOO___)); BACKGROUND-2:URL(URL(___FOO___)); BORDER: 0 0 0 0; BORDER-2: 0 0 0; BORDER-3: 0 0; BORDER-4: 0PX; BORDER-5: 0.6; FILTER:PROGID:DXIMAGETRANSFORM.MICROSOFT.ALPHA(OPACITY=100); } ";
    std::smatch what;
    // this next line causes a stack overflow
    std::regex_search( testinput.cbegin(), testinput.cend(), what, regx );  
Run Code Online (Sandbox Code Playgroud)

在异常之后查看调用堆栈,似乎在正则表达式实现中正在进行某种类型的无限递归.我目前没有GCC来测试这个.我究竟做错了什么?

更新:在下面的建议之后,我将此代码粘贴到控制台应用程序,VS 2012 x64调试,我得到堆栈溢出.如果我将其更改为x64版本,或Win32调试或发布它运行正常.咦??? 我需要重新安装VS和/或平台SDK吗?我在Win7 x64上.

更新#2:有点相关的帖子: 为什么std :: regex_iterator会导致堆栈溢出这个数据? 我想如果我重写我的正则表达式,它可能会有所帮助.我仍然不确定为什么这个位子很重要.为什么它适用于其他人,但不适用于我的系统.叹.

c++ regex visual-c++ c++11 visual-studio-2012

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

c ++ 11 std :: atomic_flag,我正确使用它吗?

我有一个简单的布尔值,我需要以线程安全的方式进行测试和设置.如果一个线程已经在工作,我希望第二个线程退出.如果我理解std::atomic_flag正确,这应该工作正常.但是,我不自信我理解std::atomic_flag正确:)我似乎无法在网上找到很多简单的例子,除了这个螺旋锁示例:

// myclass.cpp
#using <atomic>

namespace  // anonymous namespace
{
    std::atomic_flag _my_flag = ATOMIC_FLAG_INIT;
}  // ns

myclass::do_something()
{
    if ( !::_my_flag.test_and_set() ) )
    {
        // do my stuff here; handle errors and clear flag when done
        try
        {
            // do my stuff here
        }
        catch ( ... )
        {
            // handle exception
        }

        ::_my_flag.clear();  // clear my flag, we're done doing stuff
    }
    // else, we're already doing something in another thread, let's exit
} …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading c++11 stdatomic

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