小编Mar*_*tin的帖子

从并发析构函数中停止 boost::asio::io_service::run()

谁能解释一下为什么这个程序没有终止(见评论)?

#include <boost/asio/io_service.hpp>
#include <boost/asio.hpp>
#include <memory>
#include <cstdio>
#include <iostream>
#include <future>

class Service {
public:
    ~Service() {
        std::cout << "Destroying...\n";
        io_service.post([this]() {
            std::cout << "clean and stop\n"; // does not get called
            // do some cleanup
            // ...
            io_service.stop();
            std::cout << "Bye!\n";
        });
        std::cout << "...destroyed\n"; // last printed line, blocks
    }

    void operator()() {
        io_service.run();
        std::cout << "run completed\n";
    }

private:
    boost::asio::io_service io_service;
    boost::asio::io_service::work work{io_service};
};

struct Test {
    void start() {
        f = std::async(std::launch::async, [this]() { …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-asio

6
推荐指数
1
解决办法
4093
查看次数

C POSIX函数的标题

我在哪里或如何找到要包含在C++程序中的正确C头来获取在POSIX兼容环境中声明的C函数的声明?

我问这个是因为我需要open()在我的C++程序中使用系统调用来实现我的目的,所以我最初尝试包括在线文档中提到的open()(在SYNOPSIS部分中)提到的标题,它们是sys/stat.hfcntl.h.但是在尝试编译时,编译器抱怨open()没有声明.在谷歌搜索后,我发现另一种可能性是unistd.h.我尝试使用该标头和编译的程序.所以我回到POSIX文档阅读更多关于unistd.h检查是否open()在那里提到的内容,但我找不到任何相关内容.

我究竟做错了什么?为什么POSIX文档和我的GCC环境之间存在这种差异?

c++ gcc posix

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

将std :: uninitialized_fill()与任何分配器一起使用是否有意义?

std::uninitialized_fill()当用户通过参数传递的分配器用于获取内存本身时,在库中初始化内存是否有意义?我问这个是因为分配器应该提供自己的construct()方法(allocate()方法除外),其实现可能与标准方法不同,因此std::uninitialized_fill()在所有情况下可能并不总是适用.

确切地说,我的怀疑来自Stroustrup编写的C++书(附录E"标准库异常安全",E.3.1节),其中作者给出了一个可能的实现template<class T, class A> vector<T,A>::vector(size_type n, const T& val, const A& a):分配器a用于获取向量的内存,然后std::uninitialized_fill()用于初始化获得的内存.

他还给出了实现std::uninitialized_fill(),它在内部使用标准的placement new来初始化内存,但是不再有证据表明construct()分配器的方法作为参数传递给向量构造函数.

c++

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

为什么有必要用std :: string :: operator +()显式调用Myclass :: operator string()?

请考虑以下代码.我不明白为什么我的GCC编译器不会尝试隐式使用Myclass :: operator string(),尽管定义了Myclass :: operator string():

#include <string>

using namespace std;

struct T {
};

T operator+(const T& a, const T&b) { }

struct Myclass {
    operator string() const { }
    operator T() const { }
};

int main() {
    T a;
    string b;
    Myclass c;
    c + a;  // OK
    c.operator  string() + b; // OK
    c + b; // Not OK
    /* The above line does not compile, although in <string> I see:
    basic_string<_CharT, _Traits, _Alloc>
    operator+(const …
Run Code Online (Sandbox Code Playgroud)

c++

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

在纯二进制应用程序中静态链接 libstdc++ 和 libgcc 是否合法?

它是合法的distribuite已经通过静态链接建立了一个唯一的二进制应用未修改版本两者libstdc++libgccGCC套件版本4.7或更高?

c++ licensing gcc gnu

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

从通过指针取消引用从C函数调用的C++函数中抛出

考虑C库中定义的以下函数:

void f(void (*callback)(int)) { callback(0); }
Run Code Online (Sandbox Code Playgroud)

这将从C++ 11程序中调用callback(),可能会引发异常,如下所示:

void callback(int) { /* can I throw ? */}
try {
   f(callback);
} catch (...) {
   /* can the exception be caught ? */
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 标准是否允许回调在被调用时抛出f()?如果没有,我必须/应该callback()用说明noexcept符声明吗?
  2. 如果是,标准是否允许捕获抛出的异常对象?

c++ c++11

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

如何使用boost :: asio连接到unix域套接字?

我想 通过指定套接字端点的路径名来创建和连接到unix domain socket类型SOCK_SEQPACKET,但是这无法在boost::asiov1.60中编译:

using namespace boost::asio::generic;
seq_packet_protocol proto{AF_UNIX, IPPROTO_SCTP}; // SOCK_SEQPACKET
seq_packet_protocol::socket sock(io_service, proto);
boost::asio::local::basic_endpoint<seq_packet_protocol> ep("/tmp/socket");
sock.connect(ep); // does not compile
Run Code Online (Sandbox Code Playgroud)

你知道如何正确创建一个unix域套接字吗?

c++ sockets boost boost-asio

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

Git,如何“强制”壁球变基

我需要一起“挤压”一些提交。通常我习惯做这样的事情:

git rebase -i HEAD~10

但是,现在我收到以下错误:

错误:无法应用 2009972... 修复

解决此问题后,运行“git rebase --continue”。如果您更喜欢跳过此补丁,请改为运行“git rebase --skip”。要检查原始分支并停止变基,请运行“git rebase --abort”。

如您所见git,我假装我解决了所有冲突。现在,我不想也无法解决任何冲突。

我需要的是这样一种方式git:“嘿,我不想合并任何东西:只需获取此分支中所有跟踪的文件 - 因为它们出现在最后一次提交/HEAD 中,丢弃/删除之前的前 10 次提交最新的,最后“应用”这些文件作为新的提交”:

例如,假设这是所有提交哈希的列表:

1-2-3-4-5-6-7-8-9-10-11-12,其中 HEAD 指向 12。

我想压缩/删除/无论这个操作被称为包含 2-11 的所有提交,以便 a 后的最终结果git log给出:

1-12

其中操作前后的文件必须相同

获得我需要的东西的命令是什么?

git git-merge git-rebase

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

使用精确设置删除尾随 0 的优雅解决方案

有使用任何优雅溶液stdC ++或Boost库,以输出doublestd::cout的方式,在满足以下条件:

  1. 科学记数法被禁用
  2. 小数部分的精度为 6
  3. 但是,尾随0的(小数部分)不会打印出来

例如:

double d = 200000779998;
std::cout << `[something]` << d;
Run Code Online (Sandbox Code Playgroud)

应该准确打印出来200000779998[something]应该可能是noexcept一些现有操纵器的组合。

不是问题的解决方案:

std::cout << std::setprecision(6) << std::fixed << d;
Run Code Online (Sandbox Code Playgroud)

因为它打印出200000779998.000000带有尾随0

c++ boost std c++14

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

了解 boost 执行器示例

我在理解为什么boost::basic_thread_pool executor在下面这个例子中使用了一个(未记录的)接口时遇到了问题,这个接口取自boost 文档本身:

template<typename T>
struct sorter
{
    boost::basic_thread_pool pool;
    typedef std::list<T> return_type;

    std::list<T> do_sort(std::list<T> chunk_data)
    {
        if(chunk_data.empty()) {
            return chunk_data;
        }

        std::list<T> result;
        result.splice(result.begin(),chunk_data, chunk_data.begin());
        T const& partition_val=*result.begin();

        typename std::list<T>::iterator divide_point =
            std::partition(chunk_data.begin(), chunk_data.end(),
                           [&](T const& val){return val<partition_val;});

        std::list<T> new_lower_chunk;
        new_lower_chunk.splice(new_lower_chunk.end(), chunk_data,
                               chunk_data.begin(), divide_point);
        boost::future<std::list<T> > new_lower =
             boost::async(pool, &sorter::do_sort, this, std::move(new_lower_chunk));
        std::list<T> new_higher(do_sort(chunk_data));
        result.splice(result.end(),new_higher);
        while(!new_lower.is_ready()) {
            pool.schedule_one_or_yield();
        }
        result.splice(result.begin(),new_lower.get());
        return result;
    }
};
Run Code Online (Sandbox Code Playgroud)

有问题的电话是pool.schedule_one_or_yield();。如果我错了,请纠正我,但它表明提交的任务最终将被安排执行。如果是这样,不应该让之前的每个调用都boost::async(pool, &sorter::do_sort, this, std::move(new_lower_chunk));隐式地安排已提交的任务吗?

我知道 boost executor …

c++ boost

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

标签 统计

c++ ×9

boost ×4

boost-asio ×2

gcc ×2

c++11 ×1

c++14 ×1

git ×1

git-merge ×1

git-rebase ×1

gnu ×1

licensing ×1

posix ×1

sockets ×1

std ×1