小编Sca*_*ark的帖子

关于__sync_synchronize()的c ++ 98中的C++ 0x原子实现问题

我编写了followin原子模板,以模仿即将推出的c ++ 0x标准中可用的原子操作.

但是,我不确定在返回基础值时我有__sync_synchronize()调用是必要的.

根据我的理解,__sync_synchronize()是一个完整的内存屏障,我不确定在返回对象值时我需要这么昂贵的调用.

我很确定在值的设置周围需要它,但我也可以用程序集来实现它.

__asm__ __volatile__ ( "rep;nop": : :"memory" );
Run Code Online (Sandbox Code Playgroud)

有谁知道我确实需要在返回对象时使用synchronize().

M.

template < typename T >
struct atomic
{
private:
    volatile T obj;

public:
    atomic( const T & t ) :
        obj( t )
    {
    }

    inline operator T()
    {
        __sync_synchronize();   // Not sure this is overkill
        return obj;
    }

    inline atomic< T > & operator=( T val )
    {
        __sync_synchronize();   // Not sure if this is overkill
        obj = val;
        return *this;
    }

    inline T …
Run Code Online (Sandbox Code Playgroud)

c++ templates atomic c++11

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

G ++ CAS(__sync_val_compare_and_swap)问题需要解释

这是我的头脑.

我正在尝试实现一些"无锁"代码并使用CAS(gcc __sync_val_compare_and_swap)来解决这个问题.

我的问题可以通过以下代码显示.

volatile bool lock;
void *locktest( void *arg )
{
    for ( int i = 0 ; i < 100000 ; ++i )
    {
        // acquire a lock
        while( __sync_val_compare_and_swap( &lock, false, true ) == true )
        {
            // Spin while we don't acquire
        }

        // make sure we have the lock
        assert( lock == true );

        // release the lock
        assert( __sync_val_compare_and_swap( &lock, true, false ) == true );
    }
}
Run Code Online (Sandbox Code Playgroud)

好吧,如果我在10个并发线程中运行上面的代码,一切都很好.

但是,如果我将代码更改为read

        // acquire a …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading

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

如何使用boost lambda来填充带有新对象的指针向量

我最近开始使用boost lambda并且认为我会尝试在可以/易于阅读的地方使用它.

我有一些类似于以下的代码

std::vector< X * > v;
for ( int i = 0 ; i < 20 ; ++i )
    v.push_back( new X() );
Run Code Online (Sandbox Code Playgroud)

然后,删除它...

std::for_each( v.begin(), v.end(), boost::lamda::delete_ptr() );
Run Code Online (Sandbox Code Playgroud)

整齐整理.

然而,我以为我会在"lambda-ising"中使用lambda进行矢量填充...那就是烟花开始......

我试过了..

std::generate_n( v.begin(), 20, _1 = new X() );
Run Code Online (Sandbox Code Playgroud)

但这引发了各种编译器错误.

任何想法都是实现这一目标的最佳"lambda"方式.

谢谢马克.

c++ lambda containers boost stl

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

为什么这段代码的"球"似乎沿着边缘滑动

我的儿子问我是否可以写一个小程序让球在屏幕上反弹然后让我解释一下.发现一个干净的父子机会,我说"是的!,没问题".所以我挖出了我的python技能并写了这个..

#!/usr/bin/python

#
# We have to tell python what stuff we're
# going to use. We do this by asking to import
# the code we'll be making use of
#
import curses
import random
import time

#
# We'll be using a screen handling
# package called "curses" so we need
# to initialise the screen
stdscr = curses.initscr()

# We need to make sure that
# keys we type will not show up
# on the screen …
Run Code Online (Sandbox Code Playgroud)

python

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

没有朋友声明的Pimpl习语和内部对象协作

我正在使用pimpl习语实现几个类,并且遇到了一些设计问题.

首先,我总是看到像这样的pimpl

class Object
{
public:
    Visible();
    ~Visible();
 .. etc ..
private:
    class ObjectImpl *_pimpl;
};
Run Code Online (Sandbox Code Playgroud)

我有几个类使用这种方法,我的问题是这些类中的几个需要访问彼此的实现细节,但_pimpl指针是私有的delcared.

任何人都可以看到声明_pimpl公开的缺点.显然,如果它是公开的,那么有人可能会意外(或故意)重新分配它.(我忽略了这样一个事实,即"私人"可能被#defined定义为"公共"并且无论如何都会授予访问权限.如果你这样做,那么你应该得到你得到的东西).

我很欣赏我的设计可能存在缺陷,并欢迎任何评论.

我真的不喜欢使用朋友,我不确定他们甚至会帮忙,因为你不能在没有完全定义Object的情况下转发声明Object :: ObjectImpl.

 ...
 private:
    class ObjectImpl *_pimpl;
    friend class OtherObject::OtherObjectImpl; // this needs a fully qualified OtherObject
};
Run Code Online (Sandbox Code Playgroud)

谢谢马克.

*更新 - 更多细节**

我有两个类,一个叫做Command,另一个叫做Results.我在Command上有方法返回结果向量.

命令和结果都使用了pimpl习语.我希望结果的界面尽可能小.

class Command
{
public:
    void getResults( std::vector< Results > & results );
    void prepareResults( std::vector< Results > & results );
private:
    class CommandImpl *_pimpl;
};

class Results
{
public:
    class ResultsImpl;

    Results( ResultsImpl * pimpl …
Run Code Online (Sandbox Code Playgroud)

c++ pimpl-idiom friend shared-ptr

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

模板参数为零时阻止模板实例化

我有一个模板课

template< std::size_t Size >
class Buffer
{
....
};
Run Code Online (Sandbox Code Playgroud)

当Size参数为零时,我想阻止此模板的实例化.即为以下内容生成编译器警告.

Buffer< 0 > buf;
Run Code Online (Sandbox Code Playgroud)

但所有其他变种都可行.

Buffer< 10 > buf;
Run Code Online (Sandbox Code Playgroud)

我正在寻找使用boost :: enable_if_c,但我不明白如何让它工作.

- 更新 - 遗憾的是,我无法使用任何c ++ 11功能

c++ templates boost c++03

4
推荐指数
3
解决办法
238
查看次数

使用具有多个模板参数的Action启动任务

我需要在C#中启动一个Task,所以我正在创建一个action对象.

private Action<int, int, int> action = (int p1, int p2, int p3) =>
{
    // do some stuff with p1, p2 and p3.
};
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试从它创建一个任务,我认识到,new Task只能采取ActionAction<object>并拒绝接受我action与它的多个模板参数.

您是否有任何想法如何创建此任务对象并让我传递args?

c# multithreading templates task

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

基类型的C++模板继承问题

我有以下代码,它无法编译

template < typename T >
class Base
{
public:

    typedef T * TPtr;

    void func()
    {
    }
};

template < typename T >
class Derived : public Base< T >
{
public:
    using Base< T >::TPtr;
    using Base< T >::func;

    TPtr ptr;
};

int main( int c, char *v[] )
{
    Derived< int > d;
    d.func();
}
Run Code Online (Sandbox Code Playgroud)

编译器发出以下内容.

t.cpp:16: error: 'TPtr' does not name a type
t.cpp:16: note: (perhaps 'typename Base<T>::TPtr' was intended)
Run Code Online (Sandbox Code Playgroud)

现在我知道我可以简单地按照编译器的建议去做但我无法理解为什么

    using Base< T >::TPtr;
Run Code Online (Sandbox Code Playgroud)

不起作用. …

c++ inheritance templates

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

为什么我的Perl程序会警告未初始化的值?

我写了一个Perl脚本,下面会生成一个警告,我无法弄明白为什么.

#!/usr/local/bin/perl -w

$status = $ENV{ 'STATUS' };
if ( $status eq "" )
{
    $status = 0;
}
else
{
    $status = 1;
}
Run Code Online (Sandbox Code Playgroud)

它说" Use of uninitialized value in string eq at ./x.pl line 4."

第4行是" if ( $status eq "" )"行,但变量已初始化.

任何想法我怎么能摆脱这个警告..

scripting perl warnings

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

优雅的线程终止与pthread_cond_signal证明有问题

我需要解雇一堆线程,并希望优雅地降低它们.

我正在尝试使用pthread_cond_signal/ pthread_cond_wait来实现这一点,但遇到了问题.

这是我的代码.首先是thread_main

static void *thrmain( void * arg )
{
    // acquire references to the cond var, mutex, finished flag and
    // message queue
    .....

    while( true )
    {
        pthread_mutex_lock( &lock );

        if ( msq.empty() )
        {
            // no messages so wait for one.
            pthread_cond_wait( &cnd, &lock );
        }

        // are we finished.
        if ( finished )
        {
            // finished so unlock the mutex and get out of here
            pthread_mutex_unlock( &lock );
            break;
        }

        if …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading mutex pthreads

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