我正在阅读一些关于线程的手册,我想到他们展示的代码并不安全:
std::cout << "starting first helper...\n";
std::thread helper1(foo);
std::cout << "starting second helper...\n";
std::thread helper2(bar);
std::cout << "waiting for helpers to finish..." << std::endl;
helper1.join(); // #1 NOT SAFE
helper2.join(); // #2 NOT SAFE
Run Code Online (Sandbox Code Playgroud)
我相信这段代码并不是绝对安全的.如果我没有误会,当控制到达标记为和的行时,无法保证helper1并且helper2已经处于可连接状态.线程仍然无法启动,此时没有任何ID.这将导致未被捕获的异常被抛出#1#2std::thread::join()
我认为以下代码解决了这个问题.我对吗?
std::cout << "starting first helper...\n";
std::thread helper1(foo);
std::cout << "starting second helper...\n";
std::thread helper2(bar);
std::cout << "waiting for helpers to finish..." << std::endl;
while ( helper1.joinable() == false ) { }
helper1.join(); // #1 SAFE …Run Code Online (Sandbox Code Playgroud) 我有以下简单的代码:
#include <cmath>
struct init_sin
{
typedef double type;
static constexpr type value(int index) {
return 3*std::pow(std::sin(index * 2.0 * 3.1415 / 20.0),1.999);
}
};
int main(){
static double VALUE = init_sin::value(10);
double VALUE_NONSTAT = 3*std::pow(std::sin(10 * 2.0 * 3.1415 / 20.0),1.999);
return int(VALUE_NONSTAT);
}
Run Code Online (Sandbox Code Playgroud)
我想知道汇编代码的含义是什么.这里是程序集的链接:http://pastebin.com/211AfSYh
我认为这VALUE是编译时编译的,并直接作为汇编程序代码中的值,如果我没有弄错的话应该在这一行中:
33 .size main, .-main
34 .data
35 .align 8
36 .type _ZZ4mainE5VALUE, @object
GAS LISTING /tmp/ccbPDNK8.s page 2
37 .size _ZZ4mainE5VALUE, 8
38 _ZZ4mainE5VALUE:
39 0000 15143B78 .long …Run Code Online (Sandbox Code Playgroud) 好的,我有;
int grid_x = 5
int * grid;
grid = new int[grid_x];
*grid = 34;
cout << grid[0];
Run Code Online (Sandbox Code Playgroud)
第3行应该创建一个包含5个元素的数组吗?或者用数字5填充第一个元素?
第4行填充第一个元素,如何填写其余元素?
没有第4行,第5行读取"-842150451".
我不明白发生了什么,我正在尝试使用用户指定的x和y值创建二维数组,然后用用户指定的数值逐个填充每个元素.我上面的代码是尝试首先使用1维数组进行尝试.
我知道如何在结构中使用结构但是我无法工作的是结构中结构的向量.
在正常的基础上创建结构的向量例如:
vector<struct> str1(100);
Run Code Online (Sandbox Code Playgroud)
但如果我有以下代码,我该怎么做呢:
struct attribures {
string name;
bool value;
};
struct thing {
string name;
double y;
int x;
vector<attributes> attrib;
};
Run Code Online (Sandbox Code Playgroud)
我现在如何初始化向量的元素?我能做的一件事就是如下:
attributes a;
objec.attrib.push_back(a); // object is a struct of type thing
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案对我来说似乎并不优雅.反正有没有第一种?
编辑:抱歉混淆."100"实际上只是一个例子,在第二个例子中,它实际上也只是一个例子,它应该表明它是如何完成的,但对我来说似乎并不优雅.
我正在创建两个线程 thread1 和 thread2。线程 1 正在读取模拟值,线程 2 应处理线程 1 中读取的模拟值并设置 PWM 参数。到目前为止我所做的是,在主文件(我在其中创建线程)中声明了一个全局变量(用于存储模拟值)并将指向全局变量的指针传递给两个线程。在线程1中,读取的模拟值存储在全局变量中,在线程2中读取全局变量并对其进行处理。所以,我的问题是还有其他方法可以做到这一点吗?即我们有信号量、互斥量等,哪个最适合这个应用程序?
这个问题是关于合作伙伴今天遇到的一些语法,虽然我们理解它是如何工作的,但我们不明白它为什么被允许(它的用途是什么?).
看看这个片段:
fun() -> ok end().
Run Code Online (Sandbox Code Playgroud)
没有最后一对括号,这将产生如下内容:
#Fun<erl_eval.20.82930912>
Run Code Online (Sandbox Code Playgroud)
但是对于它们,评估函数产生:
ok
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么Erlang允许这种语法?为什么我要创建一个函数只是立即调用它而不是只写出它的内容?它有什么实际用途吗?
我们唯一能想到的就是在乐趣的身体中引入局部变量(但这对我来说看起来很丑陋和不清楚).
请注意,这句法等是不是在二郎山不允许的,即使它遵循前者相同的概念:
fun() -> fun() -> ok end end()().
Run Code Online (Sandbox Code Playgroud)
(这意味着:一个函数A返回一个函数B.我正在评估A(从而产生B),然后评估B得到'ok').
从这个示例项目的输出中,我看到我的对象的三个副本在我只期望一个时创建.并且只想要一个.我该怎么解决这个问题?
在我的真实代码中,ThreadedThing是一个更大/更重的类,它位于一个线程池中,我宁愿只有我真正需要的那么多.但我写了一个小演示应用程序(下面)来演示这种行为.我从增强线程样本中复制了基本代码,所以我希望它能正常工作,所以我担心这是一个C++新手的问题.
我之前编写过多线程代码,但是在Delphi而不是C++中.对于这个代码,valgrind说没有泄漏,这一切都很好,但仍然有三个对象被创建,我宁愿有一个.
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
class ThreadedThing {
public:
ThreadedThing() {
cout << "ThreadedThing created" << endl;
}
ThreadedThing(const ThreadedThing &orig) {
cout << "ThreadedThing copy created" << endl;
}
~ThreadedThing() {
cout << "ThreadedThing destroyed" << endl;
}
void operator()() {
cout << "ThreadedThing running" << endl;
sleep(2);
}
};
int main() {
std::vector < shared_ptr < boost::thread >> threads;
cout << "Started" << endl;
ThreadedThing thing;
std::shared_ptr<boost::thread> thread(new boost::thread(thing));
threads.push_back(thread);
for (std::vector < …Run Code Online (Sandbox Code Playgroud) 我有vector一些包含的引用类型reference_wrapper.由于我需要按顺序填充此容器,我正在尝试为容器设置初始大小:
vector<std::reference_wrapper<T>> v(5);
v[3] = ..
v[2] = ..
v[4] = ..
v[5] = ..
v[1] = ..
Run Code Online (Sandbox Code Playgroud)
这无法编译,如下所示:
error: no matching function for call to ‘std::reference_wrapper<int>::reference_wrapper()’
Run Code Online (Sandbox Code Playgroud)
是否有解决方法使这项工作或我必须vector<T*>为此目的使用?
我想在我的Parametrized BinaryTree类中添加Bi-Directional Iterator(就像std :: set导出的Iterator),但是我无法想出任何算法.
简单的二叉树节点结构是,它包含三个指针,左,右,父:

我正在尝试将方法作为新线程调用,以及将方法返回的值分配给变量.
例如:
int numObjects = thread t7(methodName(parameter));
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
我确定我错过了一些简单的东西,但这让我很难过.
提前致谢