我想在向量中存储一组线程,并在退出程序之前将它们全部加入.尝试加入第一个线程时,无论我在集合中放置了多少,我都会收到以下错误:
system_error: thread::join failed: No such process
Run Code Online (Sandbox Code Playgroud)
这是一些演示我的问题的简单代码:
#include <thread>
#include <iostream>
#include <vector>
#include <functional>
using std::cout;
using std::endl;
using std::vector;
using std::thread;
using std::mem_fn;
int main()
{
vector<thread> threads(1);
threads.push_back(thread([]{ cout << "Hello" << endl; }));
for_each(threads.begin(), threads.end(), mem_fn(&thread::join));
// also tried --> for(thread &t : threads) t.join()
}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下内容构建它(尝试过clang ++ 4.2.1和g ++ 5.3.1):
g++ -o src/thread_test.o -c -std=c++14 src/thread_test.cpp -pthread
g++ -o thread_test src/thread_test.o -pthread
Run Code Online (Sandbox Code Playgroud)
我在互联网上看到很多这样的例子.合同中的某些内容是否发生了变化,<thread>或者<vector>说这些例子已经解散了?
注意:作为未来读者的一小部分,我在尝试{}赋值后最终添加了(1)构造函数参数,由于私有拷贝构造函数而失败.在试图避免复制构造函数时,我最终分配了未初始化的线程 - 粗心的错误.
我在Ubuntu 16.04(4.4内核)上使用scapy收集802.11数据包.我的数据包的RadioTap标头具有以下当前标志:
present=TSFT+Flags+Rate+Channel+dBm_AntSignal+b14+b29+Ext
Run Code Online (Sandbox Code Playgroud)
鉴于RadioTap的描述,我希望Channel在头部和前面的字段之后的第10个字节处开始(对于标志和速率,每个TSFT + 1为8).通道的对齐为2,因此不需要填充.然而,这是数据包未解码部分的内容:
notdecoded=' \x08\x00\x00\x00\x00\x00\x00f\xc0 \x02\x00\x00\x00\x00\x10\x02l\t\xa0\x00\xa9\x00\x00\x00\xa9\x00'
Run Code Online (Sandbox Code Playgroud)
在这种情况下,通道号实际上出现在字节18-19('l\t'= 2412),并且我不确定哪个字节包含dBm信号强度.
任何人都知道我错过了什么?
我使用的ActorPublisher是Akka-Stream Source.我无法弄清楚如何可预测地命名输入actor,以便我可以从我的应用程序的其他部分发送消息.我正在实例化我的源代码:
val src = Source[Task](Props(classOf[TaskListener], this), "task-listener")
Run Code Online (Sandbox Code Playgroud)
我ActorRef在实现流时获得了一个,但是它的路径是动态生成的,它只使用我提供的名称作为代码生成的以流为中心的命名方案的一部分.
有没有办法让这个前端演员源有一个明确的名称或我是否卡住传递ActorRef?
如果我不能明确地命名它,这是否意味着您不能直接使用Akka-Stream进行远程处理?
编辑:我现在可以找到我的演员使用相对路径,但我仍然需要弄清楚如何命名我Flow所以我可以理解所讨论的演员的完整路径是什么.
编辑:(下面的akka版本信息,scala 2.11.6)
"com.typesafe.akka" %% "akka-actor" % "2.3.9"
"com.typesafe.akka" %% "akka-stream-experimental" % "1.0-M4"
Run Code Online (Sandbox Code Playgroud)
编辑:在akka用户谷歌小组的友好伙伴已经启发了我,并建议处理这个问题的正确方法是通过调用本身而不是使用来传递ActorRef结果.如果我发现这种状况将来会发生变化,我会更新这个问题.谢谢阅读.runWith().actorSelection()
我试图了解从方法返回时结构的行为."Rust Book"的nightlies部分有一节说如果你使用了语法......
let x = box i_return_a_struct();
Run Code Online (Sandbox Code Playgroud)
..没有副本,因此不需要返回指针.但是当我开始玩它时,似乎box不需要它,除非你需要在堆上存在值.
#[derive(Debug)]
struct Dummy {
data: i64,
}
impl Drop for Dummy {
fn drop(&mut self) {
println!("{:?} is going out of scope", self as *const Dummy);
}
}
fn make_dummy(i: i64) -> Dummy {
Dummy { data: i }
}
fn main() {
{
let i = 15i32;
println!("{:?} is a variable on the stack frame", &i as *const i32);
let dummy1 = make_dummy(1);
println!("{:?} was returned and is being …Run Code Online (Sandbox Code Playgroud) 我有一个集合Promises.我一直在寻找一种有效的方法来组成结果Futures.目前我发现将它们组合起来最干净的方法是使用scalaz Monoid,如下所示:
val promises = List(Promise[Unit], Promise[Unit], Promise[Unit])
promises.map(_.future).reduce(_ |+| _).onSuccess {
case a => println(a)
}
promises.foreach(_.success(()))
Run Code Online (Sandbox Code Playgroud)
有没有一个干净的方法来做这个不需要scalaz?
Futures集合中的数量会有所不同,许多中间集合是不可取的.
我正在尝试打包一些用于 SBT 的内部工件。libs在大多数情况下,我只会使用该目录,但有多个项目共享相同的工件。
我一直在尝试使用 SBT 生成的目录结构作为这个小型存储库的基础。它.ivy2像这样存储工件:
.ivy2/cache/[org-with-dots]/[module]/[artifact]-[version].[ext]
Run Code Online (Sandbox Code Playgroud)
我已经将我需要的东西复制cache到它自己的文件夹中,然后在 SBT 中尝试了以下模式无济于事:
resolvers += "cache" at "file:/../ivy-cache"
resolvers += Resolver.file("cache", file("../ivy-cache"))
resolvers += Resolver.file("cache", file("../ivy-cache"))(Resolver.ivyStylePatterns)
resolvers += Resolver.file("cache", file("../ivy-cache"))(Patterns("[organization]/[module]/[artifact]-[revision].[ext]"))
Run Code Online (Sandbox Code Playgroud)
这些都不起作用。最接近的是最后一个,但是组织以斜线而不是点出现。该Resolver.ivyStylePatterns组织中使用的点,但预期文件夹,名为ivys使用。
所以我有一个两部分的问题:
publish是不可取的。/到到的字符串替换.?CMake 的源代码 ( https://github.com/Kitware/CMake/blob/master/Modules/FindThreads.cmake ) 声明了以下关于“FindThreads”功能的信息:
如果使用
std::thread标准库完成线程处理,则 C++11 及更高版本不需要此模块 。
但是如果我遵循这个建议(在我的 Mint18 x86_64 系统、gcc8、CMake 3.13.2 上)我得到:
/usr/bin/ld: CMakeFiles/prism-esm-dummy.dir/src/main.cpp.o: undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
如果该模块被执行(我可以使用其他 SO 文章和之前给出的建议来尽可能地计算):
set (THREADS_PREFER_PTHREAD_FLAG ON)
find_package (Threads REQUIRED)
add_executable(my_app main.cpp)
target_link_libraries (my_app Threads::Threads)
Run Code Online (Sandbox Code Playgroud)
... 结果是一样的。
THREADS_FOUNDistrue和CMAKE_USE_PTHREADS_INITis 1,但我没有-pthread编译,或-lpthread链接期间。我检查了模块中提到的一些其他变量,我尝试的所有变量都没有设置。
有没有正确的方法来做到这一点?或者我应该只使用正常的标志并继续我的生活?
我正在玩Akka Streams,并且已经找到了大部分的基础知识,但我不清楚如何获取a的结果Merge并在其上进行进一步的操作(map,filter,fold等).
我想修改下面的代码,以便我可以进一步操作数据,而不是将合并传递给接收器.
implicit val materializer = FlowMaterializer()
val items_a = Source(List(10,20,30,40,50))
val items_b = Source(List(60,70,80,90,100))
val sink = ForeachSink(println)
val materialized = FlowGraph { implicit builder =>
import FlowGraphImplicits._
val merge = Merge[Int]("m1")
items_a ~> merge
items_b ~> merge ~> sink
}.run()
Run Code Online (Sandbox Code Playgroud)
我想我的主要问题是我无法弄清楚如何制作一个没有源代码的流组件,而且我无法弄清楚如何在不使用特殊的Merge对象和~>语法的情况下进行合并.
编辑:这个问题和答案是和Akka Streams 0.11一起使用的