这个问题是我上一个问题的延续,我的理解是“ A data race is a property of an execution, not of the program in the abstract”,这意味着只要 2 个线程不访问共享变量(至少有一个是写访问),实际上而不仅仅是理论上,那么程序的行为将得到很好的定义。
根据上述理解,我想讨论以下方案:
#include <iostream>
#include <thread>
#include <unistd.h>
constexpr int sleepTime = 10;
void func(int* ptr) {
sleep(sleepTime);
std::cout<<"going to delete ptr: "<<(uintptr_t)ptr<<"\n";
delete ptr;
std::cout<<"ptr has been deleted\n";
}
int main() {
int* l_ptr = new int(5);
std::thread t(func, l_ptr);
t.detach();
std::cout<<"We have passed ptr: "<<(uintptr_t)l_ptr<<" to thread for deletion. Val at ptr: "<<*l_ptr<<"\n";
std::cin.get();
}
Run Code Online (Sandbox Code Playgroud)
上面的程序包含数据竞争,当且仅当“主线程”和“子线程”碰巧同时访问共享变量时。 …
我正在使用C++ 14,根据我的理解,C++ 11及更高版本中的std :: string以null字符结尾.我无法理解为什么以下代码不起作用.
string a="your";
char b[5];
for(int i=0; a[i]! ='\0';i++)
b[i] =a[i] ;
cout<<b;
Run Code Online (Sandbox Code Playgroud)
输出为:"yourul"(后跟2个随机字符)
我目前在我的 RHEL 集群上使用 3.0.14 的 Cassandra 版本。我发现在我当前使用的版本之后发布了多个版本(http://www-eu.apache.org/dist/cassandra/redhat/)。我很困惑我应该如何升级我的集群,因为 3.0.x 和 3.11.x 的最后一个版本都是在 2018 年 2 月 19 日发布的。那么 3.0.x 的最新版本和 3.11 的最新版本之间究竟有什么区别。X。如果 3.11.x 更好,那么我是否应该直接将集群从 3.0.14 升级到 3.11.2?即使在升级后,我的所有数据是否仍然安全?
我偶然发现下面的代码令我感到困惑:
union
{
struct
{
uint32_t Id;
uint8_t a_data[];
}vendor;
uint8_t avp[0];
}data;
Run Code Online (Sandbox Code Playgroud)
这与g ++ 7.2.1编译良好,但我无法理解为什么.在定义a_data时如何不需要提供大小?如何将avp的大小调整为零?
我正在从我的lua模块中调用在共享对象文件中定义的C ++函数(print_no)。C ++函数采用从lua传递的参数,并使用它来初始化静态变量。
我期望当多次调用此函数时,该变量将保留它在第一次调用时获得的值。这是我目前对函数内部静态变量的理解。
这是我的C ++代码(test.cpp)
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
static int print_no(lua_State *L)
{
static double d = lua_tonumber(L, 1); /* get argument */
return 1; /* number of results */
}
static const struct luaL_Reg mylib [] =
{
{"print_no", print_no},
{NULL, NULL} /* sentinel */
};
extern "C"
{
int luaopen_mylib (lua_State *L)
{
luaL_register(L, "mylib", mylib);
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用以下命令制作一个.so文件:
g++ -shared -o mylib.so test.cpp -fPIC
Run Code Online (Sandbox Code Playgroud)
下面给出的是我的lua代码(module.lua)
temp = …Run Code Online (Sandbox Code Playgroud) 我注意到这可以编译:
#include<memory>
#include<iostream>
using namespace std;
int main()
{
unique_ptr<int>a(nullptr);
if(!a)
cout<<"NULLPTR";
}
Run Code Online (Sandbox Code Playgroud)
但是,这不是:
#include<memory>
#include<iostream>
using namespace std;
int main()
{
unique_ptr<int>a(NULL);
if(!a)
cout<<"NULL";
}
Run Code Online (Sandbox Code Playgroud)
我正在使用具有多个函数的库,这些函数返回原始指针,并且使用后必须手动释放它们。我想使用unique_ptr(带有自定义删除器)来管理这样的原始指针。我担心那些函数返回NULL的情况,因为我认为这可能会引起一些问题。
我正在尝试将多个键值对添加到具有struct作为其键和值的映射中.由于某些原因,只有我添加的第一个键值对被添加到地图中,并且找不到第二个键值对.
#include<string>
#include<iostream>
#include<map>
using namespace std;
struct RJNodeAddress
{
string m_ip;
string m_port;
bool operator<(const RJNodeAddress &l)const
{
int l_size=l.m_ip.size();
int r_size=l.m_port.size();
return (l_size < r_size);
}
};
struct RJNodeDetails
{
string m_NodeType;
int m_appId;
};
class RJWebsocket
{
public:
static map<RJNodeAddress,RJNodeDetails> m_Nodes;
};
map<RJNodeAddress,RJNodeDetails> RJWebsocket::m_Nodes;
int main()
{
RJNodeAddress l_node1,l_node2;
RJNodeDetails l_add1,l_add2;
l_node1.m_ip="172.16.129.68";
l_node1.m_port="8766";
l_node2.m_ip="172.16.128.130";
l_node2.m_port="8768";
l_add1.m_appId=0;
l_add1.m_NodeType="CM";
l_add1.m_appId=1;
l_add1.m_NodeType="CM";
RJWebsocket::m_Nodes.insert({l_node1,l_add1});
RJWebsocket::m_Nodes.insert({l_node2,l_add2});
for(const auto& j:RJWebsocket::m_Nodes)
{
cout<<endl<<"Iterating through RJWebsocket::m_Nodes"<<endl;
cout<<endl<<"port: "<<j.first.m_port<<" "<<"IP: "<<j.first.m_ip<<endl;
} …Run Code Online (Sandbox Code Playgroud) 我读过性能方面的字符数组比std :: string更好/更快。但是我个人觉得使用std :: string更容易。
我目前正在编写一些数据库API,这些API会将数据提取/插入数据库中。在这些API中,我想使用std字符串,但是我不确定由于我的选择我会付出多少性能损失。我的API将查询数据库,因此将涉及网络IO。
性能损失是否比网络延迟(〜10 ms)少得多,因为在这种情况下,我很乐意使用std :: string。