小编E.K*_*.K.的帖子

使用bzip提升iostreams - 未解析的符号

我的项目是使用旧版本的Boost的iostreams w/bzip2.我现在正在尝试升级到Boost 1.51.起初我没有用bzip编译,所以很明显我让链接器大喊大叫libboost_bzip2-vc100-mt-sgd-1_51.lib丢失了.然后我按照这些说明(并添加了静态标志)来编译该文件.

但是,运行链接器现在会返回一堆缺少的符号:

>error LNK2001: unresolved external symbol "protected: __thiscall boost::iostreams::detail::bzip2_base::~bzip2_base(void)" (??1bzip2_base@detail@iostreams@boost@@IAE@XZ)
>error LNK2001: unresolved external symbol "protected: __thiscall boost::iostreams::detail::bzip2_base::bzip2_base(struct boost::iostreams::bzip2_params const &)" (??0bzip2_base@detail@iostreams@boost@@IAE@ABUbzip2_params@23@@Z)
>error LNK2001: unresolved external symbol "int const boost::iostreams::bzip2::stream_end" (?stream_end@bzip2@iostreams@boost@@3HB)
...
Run Code Online (Sandbox Code Playgroud)

任何想法如何来lib不包含所有这些代码?我错过了什么?我在Windows上使用VS2010.


编辑:知道了!

有一个没有bzip编译的旧版libboost_iostreams-vc100-mt-sgd-1_51.lib.我仍然不确定的是:我使用的原始编译:

>b2 --with-iostreams -sBZIP2_SOURCE=D:\Work\external\bzip2-1.0.6 -sZLIB_SOURCE=d:\work\external\zlib-1.2.3 runtime-link=static
Run Code Online (Sandbox Code Playgroud)

这产生了以下文件:

libboost_bzip2-vc100-mt-s-1_51.lib
libboost_bzip2-vc100-mt-sgd-1_51.lib
Run Code Online (Sandbox Code Playgroud)

对于"正确的"编译(解决了问题),我使用了:

>b2 --with-iostreams -sBZIP2_SOURCE=D:\Work\external\bzip2-1.0.6 runtime-link=static
Run Code Online (Sandbox Code Playgroud)

即只是删除了zlib,因为它对我来说是不必要的.它产生了:

libboost_bzip2-vc100-mt-s-1_51.lib
libboost_bzip2-vc100-mt-sgd-1_51.lib
libboost_iostreams-vc100-mt-s-1_51.lib
libboost_iostreams-vc100-mt-sgd-1_51.lib
Run Code Online (Sandbox Code Playgroud)

为什么没有在原始编译中生成iostreams库?很奇怪.

谢谢.

c++ boost unresolved-external boost-iostreams bzip2

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

执行计算时 - 我应该打开多少个线程?

我正在编写一个执行一些长计算的程序,我可以根据需要分成任意数量的任务.为了便于讨论,让我们假设我正在编写一种算法,通过尝试将它除以2和p-1之间的所有数来找出数p是否为素数.显然,这个任务可以分解为许多线程.

我实际上写了一个样本应用程序就是这样做的.作为一个参数,我给出了我想要检查的数字,以及要使用的线程数(每个线程都有一个相同大小的数字范围,试图将p除以 - 它们一起覆盖整个范围).

我的机器有8个核心.我开始使用大量的程序运行程序,我知道它是素数(2971215073),并且有1,2,3个线程等,直到达到8个线程 - 每次程序运行速度比前一个快,这是我的预期.但是,当我尝试大于8的数字时,计算时间实际上变得越来越小(即使是一点点)!

在我的线程中没有I/O或类似的东西,只是纯粹的cpu计算.当我通过8个线程时,我预计运行时间会变得更糟,因为会有更多的上下文切换,并行运行线程的数量保持在8个.很难说峰值在哪里因为差异很小而且变化很大从一次运行到另一次运行,但很明显,即50个线程以某种方式运行速度超过8(约300毫秒)......

我的猜测是因为我有这么多线程,所以我得到更多的运行时间,因为我在系统的线程池中有更大的部分,所以我的线程被选中更多.但是,我创建的线程越多,程序运行得越快就越有意义(否则为什么不是每个人都创建1000个线程?).

任何人都可以提供一个解释,也许是最佳实践,关于创建相对于机器上的核心数量的线程数量?

谢谢.


我感兴趣的人的代码(在Windows上编译,VS2012):

#include <Windows.h>
#include <conio.h>
#include <iostream>
#include <thread>
#include <vector>

using namespace std;

typedef struct
{
    unsigned int primeCandidate;
    unsigned int rangeStart;
    unsigned int rangeEnd;
} param_t;


DWORD WINAPI isDivisible(LPVOID p)
{
    param_t* param = reinterpret_cast<param_t*>(p);

    for (unsigned int d = param->rangeStart; d < param->rangeEnd; ++d)
    {
        if (param->primeCandidate % d == 0)
        {
            cout << param->primeCandidate << " is divisible by " << d << endl;
            return …
Run Code Online (Sandbox Code Playgroud)

c++ parallel-processing multithreading distributed-computing threadpool

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