基本上我的问题是:调用front + pop并从两个线程推送而不同步是否安全?我已经读过这个,但从未找到明确的答案.人们说你应该使用互斥锁,但有些人暗示你可以使用两种不同的互斥锁进行推送和弹出.这是真的吗?
此代码是否具有未定义的行为?
std::queue<int> queue;
int pop()
{
int x = queue.front();
queue.pop();
return x;
}
void push(int x)
{
queue.push(x);
}
int main()
{
queue.push(1);
std::thread t1(pop);
std::thread t2(push);
t1.join();
t2.join();
}
Run Code Online (Sandbox Code Playgroud)
我会说这是未定义的行为,但你可以设计一个pop push safe队列,那么为什么std :: queue不是那样的呢?
我不明白为什么,但是在将我的项目中包含c ++ 11并使用std :: array <>之类的新功能之后,当我使用std :: thread时它突然不起作用.
这是我正在尝试运行的示例:
#include <iostream>
#include <string>
#include <thread>
void print_message_function(const std::string& msg);
int main()
{
std::string message1 = "Thread 1";
std::string message2 = "Thread 2";
std::thread thread1(print_message_function, message1);
std::thread thread2(print_message_function, message2);
thread1.join();
thread2.join();
}
void print_message_function(const std::string& msg)
{
std::cout << msg << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
编译时没有错误,运行时没有错误(也没有输出..),但是当使用调试工具时,它崩溃在这一行:
std::thread thread1(print_message_function, message1);
Run Code Online (Sandbox Code Playgroud)
这是崩溃时的堆栈:
Thread [1] (Suspended: Signal 'SIGSEGV' received. Description: Segmentation fault.)
5 _dl_fixup() 0x0000003d6920df7c
4 _dl_runtime_resolve() 0x0000003d69214625
3 std::thread::_M_start_thread() 0x0000003d762b65a7
2 std::thread::thread<void (&)(std::string const&), std::string&>() …Run Code Online (Sandbox Code Playgroud) 我在微软Visual Studio 2010中用c ++编写游戏,昨天我写了一个乒乓球游戏,一切都很好,但现在编译器告诉我有很多错误,例如:
1>w:\c++\planet escape\planet escape\room.h(25): error C2061: syntax error : identifier 'WorldMap'
Run Code Online (Sandbox Code Playgroud)
这是Room.h文件:
#pragma once
#include <allegro5/allegro.h>
#include <vector>
#include "Entity.h"
#include "WorldMap.h"
#include "Link.h"
#define ROOM_W 20
#define ROOM_H 20
class Room{
private:...
public:...
};
Run Code Online (Sandbox Code Playgroud)
在代码中没有错误,它看到所有类都很好.那么什么会导致这样的错误呢?
编辑:这是WorldMap.h
#pragma once
#include <allegro5/allegro.h>
#include "Room.h"
#include "Player.h"
#define WORLD_W 10
#define WORLD_H 10
class WorldMap{
private:...
public:...
};
Run Code Online (Sandbox Code Playgroud)
如果我在运行它时他看不清楚为什么他在编码时会看到它?
这是我分配它的方式:
char **board = new char*[width];
for(i = 0; i < width; i++){
board[i] = new char[height];
for(j = 0; j < height; j++)
board[i][j] = 0;
}
this->board = &board;
Run Code Online (Sandbox Code Playgroud)
在课堂上,它是:
char ***board;
Run Code Online (Sandbox Code Playgroud)
现在我想删除它,所以我写了这个(它是类字段的板):
for(i = 0; i < width; i++)
delete (*board)[i];
delete (*board);
Run Code Online (Sandbox Code Playgroud)
运行时:
Board* b = new Board(16, 30, 99);
delete b;
Run Code Online (Sandbox Code Playgroud)
我得到一个未处理的异常.为什么?
可能重复:
为什么这个Seg Fault?
堆栈分配是只读的:
char* arr="abc";
arr[0]='c';
Run Code Online (Sandbox Code Playgroud)
你能改变堆栈上分配的字符串吗?
我有这个代码:( BITMAPS是一个免费的名字)
class BITMAPS{
public:
static ALLEGRO_BITMAP *cursor;
static void load_bitmaps();
static void unload_bitmaps();
};
Run Code Online (Sandbox Code Playgroud)
我试图像这样使用它:( 有错误的行)
line 9: BITMAPS.load_bitmaps();
line 23: BITMAPS.unload_bitmaps();
line 36: BITMAPS.cursor;
Run Code Online (Sandbox Code Playgroud)
但我得到这样的错误 :( 错误)
line 9 and 23: syntax error : missing ';' before '.'
line 36: token '.' is illegal after UDT 'BITMAPS'
line 36: 'BITMAPS' : illegal use of this type as an expression
line 36: left of '.cursor' must have class/struct/union
Run Code Online (Sandbox Code Playgroud)
问题是什么?
编辑:
我改变了.到::现在我得到了这个: …
当您包含一些文件时发生了什么,而当您向前声明某些函数/类时发生了什么?如果两个文件包含相同文件,则第一个文件将成功读取所有功能,第二个文件将失败,但仍能够使用这些功能?
当我向前声明一些功能时会发生什么?该功能现在“保存”了吗,我可以在任何地方使用它,或者仅在同一文件中知道它?那为什么两个带有include(到带有守卫的文件)的文件将起作用?
我可以将所有内容都包含在主体中而不再打扰吗?
编辑:
以及为什么cpp文件应包含其标题?如果我不包括这些怎么办?
假设我有这个:
class foo{
Member member;
foo();
~foo();
};
Run Code Online (Sandbox Code Playgroud)
我该如何分配会员?
编辑:我该如何告诉他使用哪个构造函数?(抱歉不清楚)
现在我已经知道了member = Member(...);语法
这会导致内存泄漏吗?
{
Memory *temp = new Member();
member = *(temp); //will it work at all??(is it copy constructor?)
delete temp;
}
Run Code Online (Sandbox Code Playgroud) 这个问题困扰了我很长一段时间:
我有一个Room班级,让我说我想添加一个Ball实体.
Ball应该有x和y坐标代表这个房间的位置.
所以这是一个问题:
什么课应该保持坐标?
1)每个人Ball都是自己的.
2)Room将保持每个的坐标Ball.
我知道它可能并不重要,但什么是首选或什么更受欢迎?
编辑:
我真正担心的是,该对象可以改变它的内容,但是它受到某些第三方的限制会解决它.但我想它只对有多个用户的应用程序有效,而不是我的情况.
我有一个带元素的向量,我想要旋转它们,基本上我想采用最后的x个元素并将其推送到向量的开头:
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
Run Code Online (Sandbox Code Playgroud)
这是我目前的实施:
#include <iostream>
#include <vector>
int main()
{
int size = 9;
std::vector<int> vec(size);
for(int i = 0; i < size; i++)
{
vec[i] = i + 1;
}
for(int i = 0; i < size; i++)
{
std::cout << vec[i] << ' ';
}
std::cout << std::endl;
int spinCount = 6;
for(int i = 0; i < spinCount; i++)
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试 grep 文件中带有空格的字符串,grep 它本身适用于以下命令:
grep ": error" makeErr.txt
...results as expected...
Run Code Online (Sandbox Code Playgroud)
现在我试图把这个命令放在 watch 中,但它不起作用:
watch 1 'grep ": error:" makeErr.txt'
> grep ": error:" makeErr.txt
grep: error:": No such file or directory
Run Code Online (Sandbox Code Playgroud)
据说它试图运行grep ": error:" makeErr.txt哪个是正确的命令,但由于某种原因导致错误。我尝试了很多引号变体,但所有结果都相同。我该怎么做?
我有一个节点结构,每个节点都有子节点但没有父节点.我需要迭代这个结构,同时收集信息到3个双打.由于java没有引用我不能使用递归,除非我将为这些双精度创建一个类,并且由于节点是无父级的,因此我不能在没有递归的情况下执行它.
有没有办法在java中执行它而不更改结构或创建另一个类?
结构:
public class Skeleton
{
public Vector2D head;
public int numberOfNodes;
public Skeleton[] nodes;
public int skeletonSize;
public Color color;
...
}
Run Code Online (Sandbox Code Playgroud)