小编inc*_*ito的帖子

在 python 上模拟全局变量不起作用

我正在尝试使用模拟引擎模拟全局变量,但它似乎不仅仅适用于我的变量。例如os.name,当我打补丁时,它工作得很好,但是对于我的自定义变量,它不起作用。这是代码:

global_var.py

var = 10
Run Code Online (Sandbox Code Playgroud)

use_global_var.py

from global_var import var


def test_call():
    return var
Run Code Online (Sandbox Code Playgroud)

测试文件

import mock

from use_global_var import test_call


@mock.patch('global_var.var', 50)
def test_check():
    print(test_call())

test_check()
Run Code Online (Sandbox Code Playgroud)

print 如果我理解正确,应该返回 50,但它返回 10。有谁知道这里的问题是什么以及如何解决它?

python mocking

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

Linux 定时器挂起信号

我正在使用带有 SIGEV_THREAD 参数的 timer_create 创建 linux 计时器。

有时在我解除定时器并删除它后会调用回调。这会导致段错误,因为它尝试访问已删除的资源。

http://man7.org/linux/man-pages/man2/timer_delete.2.html

Linux手册说

timer_delete() 删除在timerid 中给出ID 的定时器。如果在此呼叫时定时器已布防,则在删除之前将其撤防。被删除的定时器产生的任何未决信号的处理是未指定的。

这基本上意味着我真的不知道回调是否会被调用,我没有办法取消它,也没有办法在清理资源之前强制传递挂起的信号。

class timer_wrapper
{
private:
    std::function<void()> callback_;
    timer_t timer_;

    static void timer_callback(sigval_t val)
    {
        static_cast<timer_wrapper*>(val.sival_ptr)->callback_();
    }
public:
    timer_wrapper(std::function<void()> callback, uint32_t interval_sec)
        : callback_(std::move(callback))
    {
        struct sigevent ev;
        ev.sigev_notify = SIGEV_THREAD;
        ev.sigev_signo = 0;
        ev.sigev_value.sival_ptr = this;
        ev.sigev_notify_function = &timer_wrapper::timer_callback;
        ev.sigev_notify_attributes = 0;
        timer_create(CLOCK_REALTIME, &ev, &timer_);

        struct itimerspec spec = {{0, 0}, {interval_sec, 0}};
        timer_settime(timer_, 0, &spec, nullptr);
    }

    ~timer_wrapper()
    {
        timer_delete(timer_);
    }
};
Run Code Online (Sandbox Code Playgroud)

如果 timer_wrapper …

c c++ linux timer

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

移动返回时调用的构造函数而不是复制

今天我发现这段代码并没有像我期望的那样工作。根据我的知识,对于 L 值,应该调用复制构造函数,而对于 R 值,应该选择移动构造函数。否则它的目的是什么,std::move实际上什么也不做,只是转换为 R 值。我原以为return obj会调用复制构造函数,但它调用了 move。我知道复制在这里毫无用处,但这就是规则。如果我的复制构造函数有副作用,这就是我的情况,该怎么办(我知道它不应该,但从技术上讲它可以 - 例如这里:std::cout 调用)。标准中有什么允许这种行为的吗?另外我怎样才能强制复制?

#include <iostream>

class X
{
public:
    X() = default;

    X(const X& r): i(r.i)
    {
        std::cout << "copy ctor" << std::endl;
    }

    X(const X&& r): i(r.i)
    {
        std::cout << "move ctor" << std::endl;
    }
    int i = 0;
};

X foo()
{
    X obj;
    obj.i = 10;
    return obj;
}

int main()
{
    X x = foo();
}
Run Code Online (Sandbox Code Playgroud)

移动演员

移动演员

move-semantics c++11

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

标签 统计

c ×1

c++ ×1

c++11 ×1

linux ×1

mocking ×1

move-semantics ×1

python ×1

timer ×1