小编Ále*_*lex的帖子

CMake依赖项:强制重新编译外部库更改

我正在尝试正确地管理目标在外部构建的库上的依赖关系,并且不知何故我没有成功.我已经阅读了大量的教程,帖子和例子,但是,因为我是CMake的新手,我想我错过了一些明显的东西.

设置如下.用另一种(CMake不支持的)语言构建的外部库产生libadatest.a.我已经使用了ExternalProject_Add.然后,有另一个使用此lib的常规C目标.一切正常,但如果我更改原始库,即使我重新编译它,C目标也不会重新编译.这是一个完整的样本.我正在使用CMake 2.8.12:

cmake_minimum_required(VERSION 2.8)    
include(ExternalProject)

ExternalProject_Add(
    AdaTestExternal # Not important
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
    BUILD_COMMAND gprbuild -P${CMAKE_CURRENT_SOURCE_DIR}/adalibtest -XOBJ_DIR=${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY} -XLIB_DIR=${CMAKE_CURRENT_BINARY_DIR}
    ALWAYS 1    # Force build, gprbuild will take care of dependencies
    # BUILD_ALWAYS 1 # For 3.0 higher versions?
    INSTALL_COMMAND ""
)
add_custom_target(AdaTest DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a)
link_directories(${CMAKE_CURRENT_BINARY_DIR}) # Needed or won't find it

add_executable(main_ada main.c)
add_dependencies(main_ada AdaTest) # We must depend on the final output lib
target_link_libraries(main_ada adatest)
Run Code Online (Sandbox Code Playgroud)

我试图创建一个依赖于实际库的中间自定义目标,然后使主C目标依赖于此目标.

当我删除外部构建的库(libadatest.a)时,这是正确的外部重新编译但主要可执行文件没有重新链接.很明显,库的时间戳比使用它的可执行文件更新鲜.

编辑:我也试过这个而不是自定义目标,同样的负面结果:

add_library(AdaTest
    UNKNOWN IMPORTED
    IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a)
Run Code Online (Sandbox Code Playgroud)

ada cmake

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

RxJava-一个生产者,一个订阅中有许多并发消费者

我正在尝试了解RxJava并发性的一些细节,但不确定自己的想法是否正确。我对SubscribeOn / ObserveOn的工作方式有很好的了解,但是我正在尝试确定池调度程序的某些细节。为此,我正在考虑实现一个1-N生产者-消费者链,该链应尽可能多地拥有尽可能多的CPU。

根据文档,Schedulers.computation()由与内核一样多的线程池支持。但是,根据无功合同,操作员只能获得顺序呼叫。

因此,这样的设置

Observable.range(1, 1000) // Whatever has to be processed
            .observeOn(Schedulers.computation())
            .doOnNext(/* heavy computation */)
            .doOnCompleted(() -> System.out.println("COMPLETED"))
            .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

即使使用线程池,也只会收到并发调用doOnNext。进行睡眠检查的实验OperatorObserveOn.java似乎证实了这一点,因为每次observeOn呼叫都会获得一名工人。另外,如果不是这样,则必须对OnCompleted进行复杂的管理,必须等待任何未完成的OnNext完成,但我发现这并不存在。

假设我在正确的轨道上(也就是说,只涉及一个线程,尽管您可以使用observeOn在其中几个线程之间跳转),那么正确的模式是什么?我可以找到相反情况的示例(将多个异步事件生成器同步到一个使用者中),但是对于这种典型情况,不是简单的示例。

我猜想涉及了flatMap,也许使用了beta版本(在1.x中),该版本限制了并发订阅的数量。可能像使用window / flatMap这样简单吗?

Observable
.range(1, 1000) // Whatever has to be processed
.window(1) // Emit one observable per item, for example 
.flatMap(/* Processing */, 4) // For 4-concurrent processing
.subscribe()
Run Code Online (Sandbox Code Playgroud)

在这种方法中,我仍然缺少以Rx通用方式最大化CPU的简单方法(即,指定计算调度程序而不是对flatMap进行最大预订)。所以,也许...:

Observable
.range(1, 1000) // Whatever has to be processed
.window(1) // Emit one observable per item, for example 
.flatMap(v -> Observable.just(v) …
Run Code Online (Sandbox Code Playgroud)

concurrency producer-consumer rx-java

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

标签 统计

ada ×1

cmake ×1

concurrency ×1

producer-consumer ×1

rx-java ×1