小编Abh*_*bhi的帖子

使用条件变量优于互斥锁的优点

我想知道在pthreads中使用条件变量而不是互斥锁的性能优势是什么.

我发现:"没有条件变量,程序员需要让线程连续轮询(可能在一个关键部分),检查是否满足条件.这可能非常耗费资源,因为线程会持续忙于此条件变量是一种在没有轮询的情况下实现相同目标的方法." (https://computing.llnl.gov/tutorials/pthreads)

但似乎互斥锁调用也是阻塞的(与自旋锁不同).因此,如果线程(T1)无法获得锁定,因为某些其他线程(T2)具有锁定,则操作系统将T1置于休眠状态,并且仅在T2释放锁定并且OS为T1提供锁定时才唤醒.线程T1没有真正轮询以获得锁定.从该描述中,似乎使用条件变量没有性能优势.在任何一种情况下,都不涉及民意调查.操作系统无论如何都提供了条件变量范例可以提供的好处.

你能解释一下究竟发生了什么吗?

variables multithreading mutex pthreads conditional-statements

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

如何在python发行版中包含docs目录

我有一个python项目,具有以下结构:

Clustering  (project name)
  clustering  (package)
    clustering.py and other modules
    tests  (sub-package)
      test_clustering.py and other such files
  docs/
  bin/
Run Code Online (Sandbox Code Playgroud)

我想在我的发行版中包含docs目录,但我似乎无法做到这一点.关于如何做到这一点的任何指示都将非常有帮助.

我当前的setup.py看起来像这样:

from distutils.core import setup
setup(name='Clustering',
      version='1.0',
      description='desc',
      author='A',
      author_email='me@somemail.com',
      packages=['clustering', 'clustering.tests'],
      requires=['numpy', 'scipy'],
      scripts=['bin/predict', 'bin/verify']
     )
Run Code Online (Sandbox Code Playgroud)

我尝试使用package_data选项,但未成功将docs目录包含在发行版中.是否有其他传统方式将您的文档包含在发行版中?

python setup.py

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

C++如何创建异构容器

我需要以(名称,值)的形式存储一系列数据点,其中值可以采用不同的类型.

我正在尝试为每个数据点使用类模板.然后对于我看到的每个数据点,我想创建一个新对象并将其推回到向量中.对于每种新类型,我需要先从模板创建一个新类.但是我不能存储在任何向量中创建的对象,因为向量对于所有条目都期望相同的类型.我需要存储的类型不能安装在继承层次结构中.他们是无关的.此外,将来可能会创建更多类型,我不想为每种新类型更改存储服务.有没有办法创建异构容器来存储这些条目?谢谢!

c++ containers heterogeneous

6
推荐指数
2
解决办法
4799
查看次数

per-cpu变量的地址

我正在为x86-64 SMP上运行的版本2.6.32编写一个小的可加载Linux的内核模块.

我的问题是:有没有办法获得内核中声明的per-cpu变量的地址的偏移量.通过偏移,我的意思是地址偏离percpu基地,这可以在gs寄存器中找到.具体来说,我试图找到current_task变量的偏移量,这是一个指向我认为当前任务的任务结构的指针.

我正在查看arch/x86/include/asm/current.h,它具有get_current()函数.此函数使用宏percpu_read_stable读取current_task per-cpu变量.据我所知,percpu_read_stable基本上扩展为asm例程,如下所示:

asm("movq %%gs:%P1, %0"
  : "=r" (ret__)
  : "m" (per_cpu__current_task))
Run Code Online (Sandbox Code Playgroud)

这是在arch/x86/include/asm/percpu.h中.我想从我的模块中读取gs之后的偏移量.如果我尝试使用per_cpu_current_task变量简单地执行printk,则模块将被终止.

感谢您的关注!

linux kernel thread-local-storage

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

C++:带符号64位整数中两个无符号64位整数的差值

我试图用C++编写一个函数,它接受两个64位无符号整数,并返回它们在带符号的64位整数中的差异.由于溢出情况,它似乎有点复杂 - 由于输入是两个无符号正整数,如果这两者之间的绝对差值大于最大有符号值(INT64_MAX),则差值不能通过有符号整数传输.所以我编写了以下实现,我想知道,首先,如果这在功能上是正确的,其次,是否有更简单的实现.任何建议将不胜感激.谢谢!(我将用例外替换断言,它现在就在那里!)

int64_t GetDifference(uint64_t first, uint64_t second) {
  uint64_t abs_diff = (first > second) ? (first - second): (second - first);    
  uint64_t msb_abs_diff = (abs_diff >> (sizeof(abs_diff)*8 - 1)) & 1;
  assert(msb_abs_diff == 0);
  int64_t diff = first - second;
  return diff;
}
Run Code Online (Sandbox Code Playgroud)

c++ unsigned-integer

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

C/C++中的安全字符串副本

我为C字符串编写了这个字符串复制例程.它应该表现得像strlcpy,即 - null如果size> 0则终止目标,并返回源字符串的长度.

但是,如果源指针或目标指针为空,我还希望函数失败,并以某种方式将此通知给调用者.但我想不出一个非常优雅的方式来做到这一点.现在我发送两个负值作为大小来表示源或目标指针指向null.因此我将返回类型从size_t更改为有符号整数,我对此接口不满意.什么是更好的界面?

  #include <cstddef> // size_t
  #include <cstdint> // 32 bit int

  const std::int32_t SRC_NULL = -1;
  const std::int32_t DST_NULL = -2;

  std::int32_t CopyStringn (char *dest, const char *src, std::size_t size) {
     const char* temp (src);
     if (temp == NULL)
         return SRC_NULL;
     if (dest == NULL)
         return DST_NULL;
     while (*temp) {
        if (size > 1) {
           *dest++ = *temp;
           --size;
        }
        ++temp;
     }

     if (size)
         *dest = '\0';

     return static_cast<std::int32_t> (temp - src); // Length does not …
Run Code Online (Sandbox Code Playgroud)

c c++ string

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