小编Sha*_*oya的帖子

C++内存分配机制性能比较(tcmalloc vs. jemalloc)

我有一个分配大量内存的应用程序,我正在考虑使用比malloc更好的内存分配机制.

我的主要选择是:jemalloc和tcmalloc.使用它们中的任何一个是否有任何好处?

http://locklessinc.com/benchmarks.shtml中 ,一些机制(包括作者的专有机制 - 无锁)之间有一个很好的比较,它提到了每个机制的优点和缺点.

鉴于这两种机制都是积极的并且不断改进.有没有人对这两者的相对表现有任何见解或经验?

c++ linux malloc tcmalloc

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

多重继承类的复制构造函数

考虑一下这段代码:

#include <vector>
#include <iostream>
using namespace std;

class Base
{
    char _type;
public:
    Base(char type):
        _type(type)
    {}

    ~Base() {
        cout << "Base destructor: " << _type << endl;
    }
};

class uncopyable
{
    protected:
        uncopyable() {}
        ~uncopyable() {}
    private:
        uncopyable( const uncopyable& );
        const uncopyable& operator=( const uncopyable& );
};

class Child : public Base, private uncopyable
{
    int j;
public:
    Child():
        Base('c')
    {}
    ~Child() {
        cout << "Child destructor" << endl;
    }
};


int main()
{
    vector<Base> v; …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance stl multiple-inheritance copy-constructor

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

GDB 无法显示堆栈并显示“#1 0x0000000000000000 in ?? ()”

我有一个多线程 C++ 程序,在极少数情况下会死锁。这个问题很难重现,我只能在远程机器上重现它。我想用来解决这个问题的方法是

  1. 运行程序
  2. 等待僵局
  3. 向它发送中止信号以生成核心转储
  4. 将转储复制回我的本地机器
  5. 使用 gdb 进行调试

我在远程机器上没有 gdb,无法在其上安装任何东西。问题是当我调试核心转储(从远程机器上的死锁或正常运行的进程获得)时,大多数线程的回溯仅显示:

(gdb) bt
#0 pthread_cond_wait () 在 ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:261
#1 0x0000000000000000 在 ?? ()

我正在使用使用“-g -O1”选项编译的静态链接二进制文件。当我在本地机器上中止相同二进制文件的进程时,gdb 可以从核心转储中提取整个堆栈并且没有这样的问题(但是我无法重现死锁)。我的远程机器是 SLES,我的本地机器是 ubuntu。

任何的想法?

编辑:

发现其他人有同样的问题,但仍然没有解决方案:http : //groups.google.com/group/google-coredumper/browse_thread/thread/2ca9bcf9465d1050 (我没有使用 google coredumper,但似乎 google coredumper 失败了有同样的错误,这表明问题可能出在 SLES 11)

c++ linux gdb dump backtrace

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

如何使makefile主机依赖?

我需要使用或不使用某些库来编译我的程序,具体取决于它运行的两个主机中的哪一个.我不知道HOST=在makefile 的右侧使用什么来使我的工作符合我的要求:

   ifeq(${HOST},${ADDITIONAL_LIBS_HOST})
   ADD_LIBS= ...   
Run Code Online (Sandbox Code Playgroud)

${ADDITIONAL_LIBS_HOST} 是来自的主人的名字 echo ${HOSTNAME}

linux makefile

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

具有细粒度锁的线程安全链表

在一个程序中,我有一个M类:

class M{
    /*
      very big immutable fields
    */
    int status;
};
Run Code Online (Sandbox Code Playgroud)

我需要一个M型对象的链表.

三种类型的线程正在访问列表:

  • 生产者:生成并将对象追加到列表的末尾.所有新生成的对象都具有status = NEW.(操作时间= O(1))
  • 消费者:在列表的开头使用对象.如果消费者具有status = CONSUMER_ID,则消费者可以使用该对象.每个消费者都将第一个项目保留在它可以消费的链表中,因此消费是(摊销?)O(1)(见下面的注释).
  • 析构函数:当有通知表明对象已正确使用时(操作时间= O(1)),删除已使用的对象.
  • 修饰符:根据状态图更改对象的状态.任何对象的最终状态是消费者的id(每个对象的操作时间= O(1)).

消费者数量少于10个.生产者数量可能高达数百个.有一个修饰符.

注意:修饰符可以修改已经消耗的对象,因此存储的消费者项目可以来回移动.我没有找到任何更好的解决方案来解决这个问题(虽然,对象之间的比较是O(1),操作不再分摊O(1)).

表现非常重要.因此,我想使用原子操作或细粒度锁(每个对象一个)来避免不必要的阻塞.

我的问题是:

  1. 原子操作是首选,因为它们更轻.我想我必须使用锁来更新析构函数线程中的指针,我可以使用原子操作来处理其他线程之间的争用.如果我遗漏了某些内容并且有理由不能在状态字段上使用原子操作,请告诉我.

  2. 我想我不能使用STL列表,因为它不支持细粒度锁.但是你会建议使用Boost :: Intrusive列表(而不是自己编写)吗? 这里提到侵入式数据结构更难以实现线程安全吗?这对于细粒度锁是否正确?

  3. 生成器,使用者和析构函数将根据某些事件异步调用(我计划使用Boost :: asio.但我不知道如何运行修饰符以最小化与其他线程的争用.选项包括:

    • 来自生产者的异步.
    • 来自消费者的异步.
    • 使用自己的计时器.

只有在某些条件成立时,任何此类呼叫才会在列表上运行.我自己的直觉是,我如何调用修饰符之间没有区别.我错过了什么吗?

我的系统是Linux/GCC,我使用boost 1.47以防万一.

类似的问题:使用细粒度方法线程安全删除链表节点

c++ linux multithreading boost linked-list

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

pthread_cond_signal导致死锁

我有一个程序在其中一个线程调用pthread_cond_siganl(或广播)时死锁.该问题在主程序中可100%重现.我无法弄清楚它有什么问题,因此提取了等待和信号被调用的代码片段.但是,无法通过提取的问题再现死锁.

valgrind在主程序上运行不会报告任何无效的读/写或内存泄漏.

我想知道调用时死锁的可能原因是什么pthread_cond_signal.

提取的片段如下.

#include <pthread.h>
#include <math.h>
#include <syscall.h>
#include <assert.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

void Task() {
    cerr << syscall(SYS_gettid) << " In Task, sleeping..." << endl;
    sleep(5);
}

pthread_mutex_t lock;
pthread_cond_t cond;
bool doingTheTask= false;

void* func(void* ) { 
    pthread_mutex_lock(&lock);
    if (doingTheTask) {
        cerr << syscall(SYS_gettid) << " wait... " << endl;
        while ( doingTheTask) {//spurious wake-up
            cerr << syscall(SYS_gettid) << " waiting..." << endl ;
            pthread_cond_wait(&cond, …
Run Code Online (Sandbox Code Playgroud)

c linux multithreading deadlock pthreads

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

Go编译器运行时的语法和语义

我在go运行时查看了runtime.c文件

  /usr/local/go/src/pkg/runtime
Run Code Online (Sandbox Code Playgroud)

并看到以下函数定义:

   void
   runtime?pprof·runtime_cyclesPerSecond(int64 res)
   {...}
Run Code Online (Sandbox Code Playgroud)

int64
runtime·tickspersecond(void)
{...}
Run Code Online (Sandbox Code Playgroud)

并且有很多声明像

void    runtime·hashinit(void);
Run Code Online (Sandbox Code Playgroud)

在runtime.h中.

我之前没有看到过这种C语法(特别是带有斜杠的语法似乎很奇怪).这是std C或某种plan9方言的一部分吗?

c namespaces go

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

使用多个互斥锁和条件变量

是否存在使条件变量使用多个互斥锁的机制?我在Linux和pthreads在C++中.

在一个应用程序中,我需要两个互斥量(而不是一个)由pthread_cond_wait()以原子方式获取和释放,但该函数只接受一个.

我有一个名为BlockingManager的类,它有以下方法:

blockMeFor( pthread_cond_t* my_cond, pthread_mutex_t* my_lock, set<int> waitees);
Run Code Online (Sandbox Code Playgroud)

我正在使用它,假设它像pthread_cond_wait一样获取/释放互斥锁.

问题是,为了实现blockingManager,我也需要一个内部互斥锁,这两个互斥锁应该被原子地获取和释放.

这里有一个相关的讨论,它说等待多个互斥锁产生未定义的行为. http://sourceware.org/ml/libc-help/2011-04/msg00011.html

我面临的问题的生产者/消费者模型如下:

我们有多个客户.每个客户都有一些任务.每个任务可能有多个先决条件(在同一客户端或其他客户端的任务中).每个客户端都有一个消费者线程 任务从一个生产者线程分配给客户端.新分配的任务可能有资格在先前任务之前完成.在某些时刻可能没有任务要完成,但如果要完成任务,至少应该完成一项任务.(它应该是节省工作的)

我每个消费者线程使用一个condvar,一旦没有任务要为该线程完成,它就会阻塞.condvar可以通过其中任何一个发出信号

  • 生产者线程分配新任务.

  • 另一个消费者线程完成任务.

我每个消费者使用一个互斥锁来保护生产者和消费者之间的共享数据结构.和一个互斥(内部互斥)来保护多个用户之间的共享数据结构.

c++ mutex pthreads producer-consumer race-condition

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