小编Sta*_*ked的帖子

好的多线程指南?

我正在寻找一个很好的C++多线程指南/教程(理想情况下).谁能指点我一个好的在线资源?

编辑:我打算熟悉一下boost线程库或Poco中的一个.

c++ multithreading

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

DRY vs"避免宏"

我正在使用Windows API在C++中创建自己的XUL实现.元素由XML解析器构造的事实要求它们具有相同的接口,因此我们不需要为每个元素构造函数编写自定义代码.结果是我的大多数元素看起来像这样:

class Button : public Element
{
public:
    static const char * Type() { return "button"; }

private:
    friend class Element;
    Button(Element * inParent, const AttributesMapping & inAttributesMapping);
};


class Label : public Element
{
public:
    static const char * Type() { return "label"; }

private:
    friend class Element;
    Label(Element * inParent, const AttributesMapping & inAttributesMapping);
};


class Description : public Element
{
public:
    static const char * Type() { return "description"; }

    virtual bool init();

private:
    friend class …
Run Code Online (Sandbox Code Playgroud)

c++ dry

6
推荐指数
3
解决办法
1152
查看次数

在实时Powerpoint演示期间记录幻灯片更改的时间戳?

我打算实施一个讲座捕获解决方案.其中一个要求是记录演示者和幻灯片.演示者显然是用摄像机录制的,幻灯片放映可能会使用像Camtasia这样的工具捕获.

现在,在播放过程中可以看到三个组件:演示者,幻灯片和目录.单击TOC中的章节标题会导致视频导航到相应的部分.这意味着必须在章节标题和视频中的时间戳之间进行映射.

通常,主题更改伴随着Powerpoint演示文稿中的幻灯片更改.因此,时间戳可以从幻灯片更改中推断出来.但是,这需要我在实时演示期间检测幻灯片更改.我不知道该怎么做.

这里的任何人都知道如何检测幻灯片更改?是否有一个Powerpoint API,我可以连接事件处理程序或类似的东西?我非常感谢你的帮助!

编辑
此问题已不再适用于我当前的工作,因此我不会更新此问题.但是,您仍然可以通过在此处发布您的答案/见解来自由地帮助他人.

streaming

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

互斥锁和锁

这两个代码示例是否相同?

Poco::ProcessHandle::PID ProcessRunner::processId() const
{
    Poco::ProcessHandle::PID pid = 0;
    mMutex.lock();
    pid = mPID;
    mMutex.unlock();
    return pid;
}
Run Code Online (Sandbox Code Playgroud)

,

Poco::ProcessHandle::PID ProcessRunner::processId() const
{
    Poco::ScopedLock<Poco::Mutex> lock(mMutex);
    return mPID;
}
Run Code Online (Sandbox Code Playgroud)
  • 在第二个示例中:在返回值复制完成后锁定是否会超出范围?如果返回的对象有许多复制指令,这就很重要.
  • 如果你只想返回一个int值,是否需要锁定?或者是复制int的原子操作?

c++ multithreading mutex poco-libraries

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

CMake链接问题

我正在尝试使用CMake编译使用C库GStreamer的C++应用程序.

我的main.cpp文件如下所示:

extern "C" {
#include <gst/gst.h>
#include <glib.h>
}


int main(int argc, char* argv[])
{
  GMainLoop *loop;

  GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink;
  GstBus *bus;

  /* Initialisation */
  gst_init (&argc, &argv);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这有效:

g++ -Wall $(pkg-config --cflags --libs gstreamer-0.10) main.cpp -o MPEG4GStreamer
Run Code Online (Sandbox Code Playgroud)

如何使用CMake制作它?我的CMakeLists.txt文件如下所示:

cmake_minimum_required (VERSION 2.6)
project (MPEG4GStreamer)
add_executable (MPEG4GStreamer main.cpp)
include(${CMAKE_ROOT}/Modules/FindPkgConfig.cmake)

# Set CMAKE_C_FLAGS variable with info from pkg-util
execute_process(COMMAND pkg-config --cflags gstreamer-0.10
                OUTPUT_VARIABLE CMAKE_C_FLAGS)
string(REPLACE "\n" "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
message("CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")

# Set CMAKE_LINKER_FLAGS …
Run Code Online (Sandbox Code Playgroud)

c++ linker executable cmake gstreamer

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

如何检查文件描述符是否有可用的数据?

我想知道fd是否有可供阅读的数据.我尝试过ioctl,FIONREAD但会导致"操作不支持错误".有任何想法吗?

c posix

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

减少功能的意外结果

我想从矢量中获取最小的元素.为此,我使用组合reducemin功能.但是,当我提供自己的实现时,min我会得到意想不到的结果:

user=> (reduce (fn [x y] (< x y) x y) [1 2 3 2 1 0 1 2])
2
user=> (reduce min [1 2 3 2 1 0 1 2 3])
0
Run Code Online (Sandbox Code Playgroud)

标准减少min按预期返回0.但是,当我提供自己的实现时,它会返回2.我做错了什么?

clojure

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

STL 中不必要的锁定?(Visual C++ Express)

我正在尝试构建一个可以扩展到多个核心的俄罗斯方块人工智能算法。

在我的测试中,结果表明使用多个线程比使用单个线程慢。

经过一些研究,我发现我的线程大部分时间都在等待_Lockit _Lock(_LOCK_DEBUG)。这是一个屏幕截图

正如您所看到的,锁应用于局部变量,无论如何它都不需要任何锁定!

我的问题是:

  • 为什么STL要锁定这个向量?
  • 我怎样才能让我的程序更快?(使用数组?)

更新

我通过在 Visual Studio 项目中设置这些命令行选项来消除锁定:

/D "_HAS_ITERATOR_DEBUGGING=0" /D "_SECURE_SCL=0"
Run Code Online (Sandbox Code Playgroud)

将其应用于解决方案文件中的所有项目非常重要,否则在运行时会发生错误(迭代器冲突等)。

我改变的第二件事是改变std::vector<bool>std::vector<char>。我不知道std::vector<bool>这么慢。

c++ multithreading stl visual-studio

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

使用volatile来防止基准测试代码中的编译器优化?

我正在创建一个小程序来衡量类型boost::shared_ptr和容器之间的性能差异boost::intrusive_ptr.为了防止编译器优化掉副本,我将变量声明为volatile.循环看起来像这样:

// TestCopy measures the time required to create n copies of the given container.
// Returns time in milliseconds.
template<class Container>
time_t TestCopy(const Container & inContainer, std::size_t n) {
    Poco::Stopwatch stopwatch;
    stopwatch.start();
    for (std::size_t idx = 0; idx < n; ++idx)
    {
        volatile Container copy = inContainer; // Volatile!
    }

    // convert microseconds to milliseconds
    return static_cast<time_t>(0.5 + (double(stopwatch.elapsed()) / 1000.0));
}
Run Code Online (Sandbox Code Playgroud)

其余的代码可以在这里找到:main.cpp.

  • 在这里使用volatile会阻止编译器优化掉副本吗?
  • 是否存在可能导致结果无效的陷阱?

更新

回应@Neil Butterworth.即使在使用副本时,我仍然认为编译器可以轻松避免复制:

for (std::size_t idx = 0; …
Run Code Online (Sandbox Code Playgroud)

c++

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

什么是最简单(和正确)的转义算法?

免责声明:这是一个理论问题,目的是增加我的理解.我知道我总是可以使用像JSON库这样的工具来解决问题.

假设我想创建一个以逗号分隔的值列表,这些值本身可能包含逗号.这些逗号需要先被转义.假设我.用作转义字符然后["a", "b,c"]变成a,b.,c.

但是,如果其中一个值最初包含一个.,序列,那么我们需要转义逗号之前逃避它们.因此[ "a", "b.,c" ]变得a,b..,c.

但是,如果其中一个值最初包含一个..,序列,那么我们需要转义逗号之前逃避它们.因此[ "a", "b..,c" ]变得a,b...,c.

但是,如果其中一个值最初包含一个...,序列,那么我们需要转义逗号之前逃避它们.因此[ "a", "b...,c" ]变得a,b....,c.

等等...

解码过程必须执行反向递归.

但是,我怀疑如果我做得太难而且有一种更简单的方法.有更简单的方法吗?

algorithm escaping

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