我翻译的例子,从在Lua编程由罗伯托·萨利姆斯使用协同程序,以C ++使用通过HTTP下载几个文件的boost :: ASIO和stackful协同程序。这是代码:
#include <iostream>
#include <chrono>
#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
using namespace std;
using namespace boost::asio;
io_service ioService;
void download(const string& host, const string& file, yield_context& yield)
{
clog << "Downloading " << host << file << " ..." << endl;
size_t fileSize = 0;
boost::system::error_code ec;
ip::tcp::resolver resolver(ioService);
ip::tcp::resolver::query query(host, "80");
auto it = resolver.async_resolve(query, yield[ec]);
ip::tcp::socket socket(ioService);
socket.async_connect(*it, yield[ec]);
ostringstream req;
req << "GET " << file << " HTTP/1.0\r\n\r\n"; …Run Code Online (Sandbox Code Playgroud) 通常,Conan包只包含构建工件,如*.dll、*.lib、*.pdb、*.so、*.a、*.dylib文件以及给定C或C++库的头文件。然而,有时当您调试使用库的代码时,能够进入库代码以查看内部发生的情况非常有用。例如,确定何时出现问题是由于库的不正确使用还是由于其中的错误。
我正在使用Simple-Web-Server库来创建简单的 Web 服务,以便将XML转换为JSON,反之亦然。反过来,它使用了几个boost库以及其中的boost::coroutine。对于XML<->JSON转换,我使用boost::property_tree库进行中间表示。这是代码:
#include <iostream>
#include <sstream>
#include <server_http.hpp>
#define BOOST_SPIRIT_THREADSAFE
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/xml_parser.hpp>
using namespace std;
using namespace boost::property_tree;
using HttpServer = SimpleWeb::Server<SimpleWeb::HTTP>;
int main()
{
HttpServer server(8080, 1);
server.resource["^/json_to_xml$"]["POST"] = [](auto& response, auto request) {
try
{
ptree pt;
read_json(request->content, pt);
ostringstream json, xml;
write_json(json, pt);
clog << "JSON request content:" << endl << json.str() << endl;
write_xml(xml, pt, xml_writer_make_settings<ptree::key_type>(' ', …Run Code Online (Sandbox Code Playgroud) 我正在使用自定义boost::log格式化程序对输出日志消息进行颜色编码,但我找不到将TimeStamp和ThreadID属性添加到日志的正确方法。当我使用文件日志记录时,我只是将其写keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%"为logging::add_file_log参数。我想在以下自定义格式化程序中具有类似的效果:
void coloring_formatter(const logging::record_view& record,
logging::formatting_ostream& stream)
{
auto severity = record[logging::trivial::severity];
assert(severity);
stream << "\e[1m";
switch (severity.get())
{
case logging::trivial::severity_level::trace:
stream << "\e[97m";
break;
case logging::trivial::severity_level::debug:
stream << "\e[34m";
break;
case logging::trivial::severity_level::info:
stream << "\e[32m";
break;
case logging::trivial::severity_level::warning:
stream << "\e[93m";
break;
case logging::trivial::severity_level::error:
stream << "\e[91m";
break;
case logging::trivial::severity_level::fatal:
stream << "\e[41m";
break;
}
stream // << output TimeStamp
// << output ThreadID …Run Code Online (Sandbox Code Playgroud) 我想实现 PostgreSQL 表的更改历史记录。该表的定义方式如下:
CREATE TABLE "ps_counters"
(
"psid" integer NOT NULL,
"counter" bigint[] NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我希望历史表看起来像:
CREATE TABLE "ps_counters_history"
(
"timestamp" timestamp NOT NULL,
"psid" integer NOT NULL,
"counter" bigint[] NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我需要一个触发器和一个存储过程,在每次更改(插入或更新)时ps_couneters插入ps_counters_history,但除了防止ps_counters_history变得太大之外,我希望ps_counters_history每个月对表进行分区。
我正在使用boost::asio编写服务器。我有多个线程,每个线程都拥有自己的io_service对象。当没有要执行的完成处理程序时,我使用io_service::work对象来保持io_service运行。在某些时刻,我正在调用对象的stop方法io_service来完成调用io_serice::run. 但是在某些情况下,当我打电话时,stop我已经发布了io_service尚未完成的对象竞争处理程序。调用会stop阻止发布的竞争处理程序执行,但这对我来说是不可接受的,因为我需要在停止线程之前完成所有挂起的工作。如何在调用stop方法之前等待所有挂起的完成处理程序首先被执行io_service?
我目前正在阅读Anthony Williams撰写的《 C ++ Concurrency in Action》一书,其中有几种无锁数据结构实现。在安东尼所写的关于无锁数据结构的章节的前面,他正在写作:
这给我们带来了无锁和无等待代码的另一个缺点:尽管它可能增加数据结构上操作并发的可能性,并减少单个线程花在等待上的时间,但它可能会降低整体性能。
的确,我针对前一章中基于锁的实现测试了本书中描述的所有无锁堆栈实现。而且似乎无锁代码的性能始终低于基于锁的堆栈。
在什么情况下,无锁数据结构更理想,因此必须首选?
在 C 中有一个restrict关键字告诉编译器在函数的指针参数之间没有别名,允许它以这种方式执行一些否则将不允许的优化。例如:
void add(int* restrict ptrA,
int* restrict ptrB,
int* restrict val)
{
*ptrA += *val;
*ptrB += *val;
}
Run Code Online (Sandbox Code Playgroud)
现在函数体中的指令可以并行执行,因为val和 某些ptr参数之间没有别名。在 C++ 中没有restrict关键字。
restrictC 中的语义?例如MSVC、g++、clang++和Intel C++ compiler。restrict在未来的 C++ 标准中是否有任何计划要标准化的关键字?我正在考虑开始使用Conan包管理器来管理我的 C++ 项目的第三方依赖项,但我找不到如何仅链接到Conan包中的某些库。我使用CMake作为构建系统,并使用Conan多配置CMake生成器:cmake_multi。
按照文档中的示例,我有以下代码:
project(FoundationTimer)
cmake_minimum_required(VERSION 2.8.12)
set(TARGET_NAME timer)
include(${CMAKE_BINARY_DIR}/conanbuildinfo_multi.cmake)
conan_basic_setup(TARGETS)
add_executable(${TARGET_NAME} timer.cpp)
target_link_libraries(${TARGET_NAME} CONAN_PKG::Poco)
Run Code Online (Sandbox Code Playgroud)
在我的CMakeLists.txt。
使用CMake生成解决方案后:
conan install -g cmake_multi -s build_type=Debug -s compiler.runtime=MDd ..\mytimer\
conan install -g cmake_multi -s build_type=Release -s compiler.runtime=MD ..\mytimer\
cmake ..\mytimer\ -G "Visual Studio 14 2015 Win64"
Run Code Online (Sandbox Code Playgroud)
这会生成对Conan包中的所有库以及Poco Conan包所依赖的其他Conan包中的所有库(如OpenSSL和zlib )的依赖关系。
用于调试配置的Visual Studio项目选项中的其他依赖项设置为:
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoUtilmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoMongoDBmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoNetmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoNetSSLWinmdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoCryptomdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoDatamdd.lib
C:\Users\ivan.bobev\.conan\data\Poco\1.7.8p3\pocoproject\stable\package\67348df82fcd362bbf088991f95bb229be582635\lib\PocoDataSQLitemdd.lib …Run Code Online (Sandbox Code Playgroud) 如今,我从不同的地方听说所谓的 GPU 驱动渲染,这是一种新的渲染范例,根本不需要绘制调用,并且它受到新版本 OpenGL 和 Vulkan API 的支持。有人可以解释它在概念层面上的实际工作原理以及与传统方法的主要区别是什么?