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 状态重置为“发送”。
我正在 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 似乎不适用于这种情况。
与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)
基本上,我们设置了一个跳转表,为我们的访问者调用正确的调度程序。
对于多个变体,它似乎更复杂,因为对于这种方法,您需要计算所有变体替代方案的笛卡尔积,并可能模板化数千个函数。这是它的完成方式还是标准库有更好的实现方式?
我正在尝试让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)
我希望它逐个像素地遍历窗口,从而创建一个平滑的形状。我实际得到的是似乎要采样的东西,如下所示。
量化正弦波
最近我发现了这个关于使用模板展开循环的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)