小编itz*_*ode的帖子

Win32:是否有与 POSIX sem_init 等效的东西?

POSIX 匿名信号量允许我在共享内存中创建和使用信号量。这非常有效,因为这意味着不应访问信号量的其他进程也无法访问信号量。此外,它很容易融入现有结构。

Windows 提供类似的功能吗?我发现的最接近的事情是CreateSemaphore在没有名字的情况下打电话,然后将其继承或DuplicateHandle()传给孩子。

编辑:@IInspectable 希望我提供背景信息。我计划通过共享内存实现一种 RPC 系统。共享内存中的数据如下所示:

struct shm_rpc_block {
  enum rpc_state {
    send = 0,
    receive
  };
  rpc_state state;
  sem_t lock;
  char data[2048 - sizeof(rpc_state) - sizeof(sem_t)];
};
Run Code Online (Sandbox Code Playgroud)

state变量从“发送”状态开始。进程 1 将其数据写入数组data,然后将状态更改为“接收”并解锁,从而允许进程 2 锁定。进程2读取发送的数据,生成响应,然后将其发回。然后第一个进程读取结果,并将 RPC 状态重置为“发送”。

winapi semaphore

17
推荐指数
1
解决办法
1646
查看次数

对于 std::Optional,“从重载解析中删除移动构造函数”是什么意思?

我正在 C++14 中创建一个实现std::optional。但是,我对如何指定移动构造函数有点困惑。这就是我所指的(强调我的):

里面的表达式noexcept相当于is_nothrow_move_constructible_v<T>. 除非是,否则此构造函数不应参与重载决策is_move_constructible_v<T>true。如果is_trivially_move_constructible_v<T>true,则此构造函数应为 constexpr 构造函数。

从重载决策中删除移动构造函数意味着什么?删除和 SFINAE 似乎不适用于这种情况。

c++ language-lawyer c++14 option-type

5
推荐指数
2
解决办法
752
查看次数

std::visit 如何处理多个变体?

与How does std::visit work with std::variant?相关,但不是同一个问题。

从概念上讲,单个变体的实现std::visit如下所示(在 C++ 伪代码中):

template<class F, class... Ts>
void visit(F&& f, variant<Ts...>&& var) {
  using caller_type = void(*)(void*);
  caller_type dispatch[] = {dispatch_visitor(f, (INDEX_SEQUENCE))...};
  dispatch[var.index()](var);
};
Run Code Online (Sandbox Code Playgroud)

基本上,我们设置了一个跳转表,为我们的访问者调用正确的调度程序。

对于多个变体,它似乎更复杂,因为对于这种方法,您需要计算所有变体替代方案的笛卡尔积,并可能模板化数千个函数。这是它的完成方式还是标准库有更好的实现方式?

c++ template-meta-programming

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

为什么处理会以粗略的方式绘制我的正弦波?

我正在尝试让Processing绘制正弦波。但是,它看起来像是输出中正弦波的采样错误版本。我需要用一系列线条代替形状,还是有其他解决方案?

我尝试将变量强制转换为float,然后更改c++c += 1

  noFill();
  stroke(255);
  beginShape();
  translate(0, 100);
  for (int c = 0; c <= width; c += 1)
  {
    vertex(c, (float) 100 * sin(c / 50));
  }
  endShape();
Run Code Online (Sandbox Code Playgroud)

我希望它逐个像素地遍历窗口,从而创建一个平滑的形状。我实际得到的是似乎要采样的东西,如下所示。

量化正弦波

java processing

2
推荐指数
1
解决办法
45
查看次数

为什么此参数包中的函数调用要向后求值?

最近我发现了这个关于使用模板展开循环的StackOverflow 答案。答案指出“这个想法适用于 C++11”,我最终得到了这个:

namespace tmpl {
  namespace details {
    template<class T, T... values>
    class integer_sequence {
    public:
      static constexpr size_t size() { return sizeof...(values); }
    };
    
    template<class T, class N, class... Is>
    struct make_integer_sequence_helper :
      make_integer_sequence_helper<T, std::integral_constant<T, N::value - 1>, std::integral_constant<T, N::value - 1>, Is...> {};
      
    template<class T, class... Is>
    struct make_integer_sequence_helper<T, std::integral_constant<T, 0>, Is...> {
      using type = integer_sequence<T, Is::value...>;
    };
    
    template<class T, T N>
    using make_integer_sequence = typename make_integer_sequence_helper<T, std::integral_constant<T, N>>::type;
    
    template<class... Ts>
    void variadic_noop(Ts... params) …
Run Code Online (Sandbox Code Playgroud)

c++ for-loop template-meta-programming

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