小编Mic*_*ser的帖子

何时使用pthread条件变量?

pthread问题;

看来条件变量只有在另一个线程调用pthread_cond_notify之前调用pthread_cond_wait时才有效.如果在等待之前以某种方式通知,则等待将被卡住;

我的问题是; 什么时候应该使用条件变量?调度程序可以抢占线程并在等待之前通知发生;

等待信号量没有这个问题 - 这些有一个计数器,还是什么时候条件变量更好?

这是一个测试

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

// test of conditional variables;
// if cond-var is notified before wait starts, then wait never wakes up !!!
// better to use semaphores than this crap.

pthread_mutex_t cond_var_lock =  PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;

int wait_first = 1;

void *tfunc(void *arg)
{
    (void) arg;

    if (!wait_first)
        sleep(1);

    fprintf(stderr,"on enter cond_var_lock %lx\n", pthread_self());
    pthread_mutex_lock( &cond_var_lock);
    fprintf(stderr,"before pthread_cond_wait %lx\n", pthread_self());
    pthread_cond_wait( &cond_var, &cond_var_lock);
    fprintf(stderr,"after pthread_cond_wait %lx\n", pthread_self()); …
Run Code Online (Sandbox Code Playgroud)

c linux pthreads

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

在GCC中,std :: list的size()方法是O(n).为什么?

在GCC中,std :: list的size()方法是O(n).为什么?

for the C++ 11 in the standard说list的size()应该是O(1) http://en.cppreference.com/w/cpp/container/list/size

但是在glibc中我们有以下内容:

/usr/include/c++/4.6.3/bits/stl_list.h

template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class list : protected _List_base<_Tp, _Alloc>
{
 ...
 size_type
  size() const
  { return std::distance(begin(), end()); }
Run Code Online (Sandbox Code Playgroud)

问题是:如何在海湾合作委员会中实施一项为期三年的要求?

编辑:gcc 5改变了这一点:虽然以ABI变化为代价; 这意味着使用gcc 5.0编译的c ++代码不适用于旧版本的c ++运行时库.

来自https://gcc.gnu.org/gcc-5/changes.html "默认情况下启用std :: list的新实现,带有O(1)size()函数"

c++ size gcc stdlist c++11

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

在全局运算符new返回的指针上使用realloc

realloc在C++中没有; 当然,你总是可以分配一个新块new,将旧块复制到新块,释放旧块delete.

问题是realloc通常比这更快 - 当内存块"就地"重新调整大小时会发生这种情况 - 即返回值realloc恰好与参数指针值相同; 这也避免了将内存从旧块复制到新块.

标准说什么 - 是否允许将全局new运算符返回的指针传递给realloc?(glibc中都newmalloc使用相同的分配,所以不应该在这里是一个实际问题).C++标准对此主题有什么要说的吗?

(当前glibc标准C++库不执行realloc,即使在向量中 - 因为一旦分配了一个对象,运行时就无法在旧内存块上调用析构函数并在新块上调用new new - 如果内存块被移动了realloc.如果标准库有一个realloc不能将参数块移动到新位置的就地,那会更简单)

编辑:

实际上一些内存分配器具有就地realloc功能; 这些当然是非标准的.

  • jemalloc有一个rallocm带有标志的APIALLOCM_NO_MOVE
  • dlmalloc(Doug Lea malloc)有一个名为的APIdlrealloc_in_place

如果您使用jemalloc或dlmalloc为全球运营商newdelete,那么你可以使用这些非标准的功能,在就地尝试了一个向量类realloc之前它移动malloc与复制.或者可以请求C++标准委员会在标准中添加全局非移动重新分配方法.

编辑:

或者你可以做一个通过malloc/ realloc/ 来完成内存管理的向量类free,但是如果元素类型是普通的旧数据(例如,如果std::is_pod在向量所持有的类型上返回true),则只能实例化此实现.

c++ dynamic-memory-allocation

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

haskell序曲:seq的定义

haskell前奏定义中,我们看到它...是为无法在Haskell中实现的表达式保留的.现在IOmonad例如无法在haskell中实现.

让我感到惊讶的是seq前奏中定义如下

seq :: a -> b -> b
seq = ...       -- Primitive
Run Code Online (Sandbox Code Playgroud)

为什么不以下?我错过了什么?

seq _ b = b
Run Code Online (Sandbox Code Playgroud)

haskell

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

为什么chrono :: nanoseconds的表示类型是有符号整数类型?

在文件/usr/include/c++/4.8中的gcc 4.84中我们有

namespace std  
{
   typedef duration<int64_t, nano>     nanoseconds;
Run Code Online (Sandbox Code Playgroud)

为什么纳秒的表示类型是有符号整数类型?为什么不签名?我们什么时候可以有一个负值的持续时间对象?

c++ std c++-chrono

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

标签 统计

c++ ×3

c ×1

c++-chrono ×1

c++11 ×1

dynamic-memory-allocation ×1

gcc ×1

haskell ×1

linux ×1

pthreads ×1

size ×1

std ×1

stdlist ×1