小编Vis*_*rma的帖子

推理包含数据竞争的程序

这个问题是我上一个问题的延续,我的理解是“ 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++ c++14 data-race

3
推荐指数
2
解决办法
118
查看次数

字符串复制到字符数组

我正在使用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个随机字符)

c++ string

2
推荐指数
2
解决办法
62
查看次数

cassandra 3.0.x 和 3.11.x 版本的区别

我目前在我的 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?即使在升级后,我的所有数据是否仍然安全?

cassandra cassandra-3.0

2
推荐指数
1
解决办法
2169
查看次数

定义没有大小或零大小的数组

我偶然发现下面的代码令我感到困惑:

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的大小调整为零?

c++ c++11

2
推荐指数
1
解决办法
81
查看次数

在从lua调用的C ++函数中打印静态变量

我正在从我的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)

c++ lua

2
推荐指数
1
解决办法
41
查看次数

如何安全地将unique_ptr与可以返回NULL的函数一起使用?

我注意到这可以编译:

#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的情况,因为我认为这可能会引起一些问题。

c++ smart-pointers unique-ptr c++14

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

无法添加多个键以将struct作为键映射

我正在尝试将多个键值对添加到具有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)

c++ std

0
推荐指数
1
解决办法
60
查看次数

在使用std :: string和字符数组之间进行选择

我读过性能方面的字符数组比std :: string更好/更快。但是我个人觉得使用std :: string更容易。

我目前正在编写一些数据库API,这些API会将数据提取/插入数据库中。在这些API中,我想使用std字符串,但是我不确定由于我的选择我会付出多少性能损失。我的API将查询数据库,因此将涉及网络IO。

性能损失是否比网络延迟(〜10 ms)少得多,因为在这种情况下,我很乐意使用std :: string。

c++

0
推荐指数
1
解决办法
186
查看次数