我正在构建一个基于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)...单线程会成为多核系统的瓶颈吗?我假设任何阻塞操作都会阻止所有其他请求执行.如果确实如此,为了最大化吞吐量,我正在考虑基于协程的接收数据异步事件,我的内部阻塞任务的线程池(利用多核),然后是异步发送和关闭连接机制.同样,可扩展性至关重要.有什么想法吗?
我正在将一些旧的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会导致堆栈溢出这个数据? 我想如果我重写我的正则表达式,它可能会有所帮助.我仍然不确定为什么这个位子很重要.为什么它适用于其他人,但不适用于我的系统.叹.
我有一个简单的布尔值,我需要以线程安全的方式进行测试和设置.如果一个线程已经在工作,我希望第二个线程退出.如果我理解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)