小编Ulr*_*rdt的帖子

内存堆分配器库保持独立的结构?

这是我的问题:我需要管理我的程序无法读取或写入的远程连续缓冲区中的内存.它需要具有malloc()/ free()语义,并支持设置最小对齐和碎片避免(尽可能).由于我无法直接读取或写入此缓冲区,因此我需要使用本地结构来管理所有分配.

我已经在使用boost了,所以如果可以按摩内部的东西来做到这一点,那就太好了.但是,我并不反对使用C库或类似的东西.

举个例子,我需要一个非IPC版本的:

boost::interprocess::basic_managed_external_buffer<
                     char,
                     boost::interprocess::rbtree_best_fit<
                                          boost::interprocess::mutex_family,
                                          boost::interprocess::offset_ptr<void>,
                                          SOME_ALIGNMENT>,
                     boost::interprocess::iset_index>
Run Code Online (Sandbox Code Playgroud)

最好使用malloc/free语义而不是new/delete但是没有实际读取或写入底层缓冲区(并将所有分配信息/数据结构保存在单独的缓冲区中)

有任何想法吗?

PS我不希望boost :: interprocess示例误导,我只是熟悉接口,所以以它为例.应用程序实际上不是进程间的,分配器只能在我的应用程序中使用.

具体来说,我希望能够管理一个16GB的外部缓冲区,其分配大小从128字节一直到512MB.这是严格的64位代码,但即便如此我更喜欢指针类型作为模板参数,所以我可以明确地使用uint64_t.

c++ memory boost memory-management

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

创建一个 time.Duration from float64 秒

我有一个float64包含以秒为单位的持续时间。我正在寻找一种方法将此值转换为time.Duration. 我能够执行此转换,但我想知道是否没有更优雅的方法。

我的方法是这样的:

    var timeout float64 // input value of float type

    var res time.Duration // result value of time.Duration type

    res += time.Duration(math.Round(timeout)) * time.Second
    timeout -= math.Round(timeout)
    timeout *= 1000
    res += time.Duration(math.Round(timeout)) * time.Millisecond
    timeout -= math.Round(timeout)
    timeout *= 1000
    res += time.Duration(math.Round(timeout)) * time.Microsecond
    timeout -= math.Round(timeout)
    timeout *= 1000
    res += time.Duration(math.Round(timeout)) * time.Nanosecond

    return res
Run Code Online (Sandbox Code Playgroud)

我不喜欢的是它很麻烦而且不可靠。我希望 Go 能够开箱即用地提供类似的东西,并以检测溢出和类似范围违规的方式执行这些转换。似乎Go 还没有出现,但也许我错过了一些明显的东西,因此我的问题。

笔记:

  • 这个问题没有解决我的需求,因为它与相反的转换方式相当相关。这种转换实际上非常轻松,这让我更惊讶的是我需要的转换并不存在。
  • 为什么我不使用毫秒呢?原因很简单:一致性、KISS 原则、最小意外原则。时间的 SI 单位是秒。其他一切都仅源于此,因此我使用它作为默认值。
  • 关于之前的声明的挑剔:Go 本身说“没有对天或更大单位的定义,以避免夏令时时区转换之间的混淆。”。他们没有抓住重点,因为他们仍然有分钟和小时,尽管分钟有 …

time data-conversion go

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

死锁使用std :: mutex来保护多线程中的cout

在多个线程中使用cout可能会导致交错输出.
所以我试图用互斥锁来保护cout.

以下代码使用std :: async启动10个后台线程.线程启动时,会打印"Started thread ...".主线程按照创建顺序迭代后台线程的未来,并在相应的线程完成时打印出"Done thread ...".

输出正确同步,但在某些线程启动后有些线程已经完成(参见下面的输出),就会出现死锁.剩下所有后台线程,主线程正在等待互斥锁.

僵局的原因是什么?

当保留打印功能或for循环的一次迭代结束时,lock_guard应解锁互斥锁,以便其中一个等待线程能够继续.

为什么所有线程都挨饿?

#include <future>
#include <iostream>
#include <vector>

using namespace std;
std::mutex mtx;           // mutex for critical section

int print_start(int i) {
   lock_guard<mutex> g(mtx);
   cout << "Started thread" << i << "(" << this_thread::get_id() << ") " << endl;
   return i;
}

int main() {
   vector<future<int>> futures;

   for (int i = 0; i < 10; ++i) {
      futures.push_back(async(print_start, i));
   }

   //retrieve and print the value stored in the …
Run Code Online (Sandbox Code Playgroud)

c++ concurrency multithreading mutex deadlock

12
推荐指数
2
解决办法
1087
查看次数

C语言中的功能序言与结语

我知道嵌套函数调用中的数据会转到堆栈.堆栈本身实现了一个逐步的方法,用于在函数被调用或返回时从堆栈中存储和检索数据.这些方法的名称大多称为Prologue和结语.

我试图搜索关于这个主题的材料没有成功.你们知道关于函数序言和结语如何在C中起作用的任何资源(网站,视频,文章)吗?或者,如果你能解释会更好.

PS:我只是想要一些一般的观点,不是太详细.

c c++

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

为什么Conda在激活环境后无法调用正确的Python版本?

我在Linux下有以下conda环境:

$ conda info -e
# conda environments:
#
py33                     /u21/coyotito/.anaconda/envs/py33
root                  *  /u21/coyotito/.anaconda
Run Code Online (Sandbox Code Playgroud)

py33使用此命令创建:

$ conda create -n py33 python=3.3 anaconda
Run Code Online (Sandbox Code Playgroud)

问题是当我激活py33它仍然无法调用Python版本3.3.

[coyotito@pearl ~]$ source activate py33
(coyotito)[coyotito@pearl ~]$ python --version
Python 2.7.10 :: Anaconda 2.1.0 (64-bit)
(coyotito)[coyotito@pearl ~]$ conda info -e
# conda environments:
#
py33                     /u21/coyotito/.anaconda/envs/py33
root                  *  /u21/coyotito/.anaconda
Run Code Online (Sandbox Code Playgroud)

即它仍然调用旧的python.另请注意,括号下的提示不是(py33).

(coyotito)[coyotito@pearl ~]$ which python
~/.anaconda/bin/python
Run Code Online (Sandbox Code Playgroud)

在新环境中代替python:

~/.anaconda/envs/py33/bin/python3.3
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

更新

我的PATH环境~/.bash_profile如下所示:

export PATH=$HOME/.anaconda/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

python anaconda

11
推荐指数
5
解决办法
3246
查看次数

如何在Linux上正确卸载pyenv?

我已经安装pyenv在树莓派上,但现在我想卸载它。

我已经运行了该命令rm -rf $(pyenv root),但现在它说从我的“shell 启动配置”中删除行。这是什么意思?我在我的文件中发现了这一行.bash_profile

if command -v pyenv 1>/dev/null 2>&1; then
    eval"$(pyenv init-)"
fi
Run Code Online (Sandbox Code Playgroud)

文件.bashrc末尾有:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

我应该只删除(或评论#)来自的内容吗.bash_profile?或者也许来自两个文件?

python bash pyenv

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

保存数据的最佳方法

我上了一堂课,想要跟踪学生的统计数据.我打算稍后制作一个GUI来操作这些数据.

我的主要问题是:保存和以后检索此数据的最佳方法是什么?

我读过关于pickle和JSON的内容,但我并没有真正了解它们是如何工作的(特别是关于它们如何保存数据,比如在哪种格式和哪里).

python serialization save

10
推荐指数
2
解决办法
2万
查看次数

用于稀疏数据查找的高效数据结构

情况:

给定一些带坐标(x,y)的点,范围0 <x <100,000,000和0 <y <100,000,000

我必须找到最小的正方形,其边缘和内部至少包含N个点.

  1. 我使用矢量来存储坐标并搜索所有正方形,边长minLength到边长maxLength(在相关空间中施加蛮力)

    struct Point
    {
            int x;
            int y;
    };
    
    vector<Point> P;
    int minLength = sqrt(N) - 1;
    int maxLength = 0;
    
    //   bigx= largest x coordinate of any point
    //   bigy= largest y coordinate of any point
    //   smallx= smallest x coordinate of any point
    //   smally= smallest y coordinate of any point
    
    (bigx - smallx) < (bigy - smally) ? maxLength = (bigx - smallx) : maxLength = (bigy - smally);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于我查找的每个方格,遍历完整的向量以查看其边缘和内部是否至少有N个点. …

c++ algorithm

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

如何为C程序生成程序依赖图?

我想从C源代码生成程序依赖图(PDG).我找到了解释它是怎么做的论文,但都使用了商业CodeSurfer工具.

有没有免费工具可以做到这一点?

c static-analysis graph

9
推荐指数
2
解决办法
7468
查看次数

关闭窗口不会终止所有进程

我有一个非常简单的程序,只需按一下按钮即可显示简单的图表.我的问题是,当我关闭应用程序窗口时,程序会一直运行,直到我从终端终止它.下面是我的代码,我的调查表明问题是由

matplotlib.use('TkAgg')
Run Code Online (Sandbox Code Playgroud)

但我不知道如何解决它!如果它有帮助,我正在运行OSX.

#!/usr/bin/python

from Tkinter import *
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
# ------ End of imports

class Ops:
    def show_plot(self):
        self.f, self.figarray = plt.subplots(1, sharex=True, sharey=True)
        self.figarray.plot((1,2,3),(1,2,3))
        plt.tight_layout()
        self.canvas = FigureCanvasTkAgg(self.f, master=self.mainFrame)
        self.canvas._tkcanvas.config(background='white', borderwidth=0, highlightthickness=0)
        self.canvas._tkcanvas.pack(side=TOP, fill=BOTH)


class GUI(Ops):
    def __init__(self, master):
        self.master = master
        self.width = self.master.winfo_screenwidth()  # Width of the screen
        self.height = self.master.winfo_screenheight()  # Height of the screen
        self.x = (self.width / 2)
        self.y = (self.height / 2)
        self.master.geometry("%dx%d+%d+%d" …
Run Code Online (Sandbox Code Playgroud)

python tkinter osx-yosemite

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