小编Kid*_*nbo的帖子

Java for循环中是否有针对线程安全性的优化?

我有一段代码,可以在两个线程中更改一个计数器。它不是线程安全的,因为我没有在代码中放置任何原子变量或锁。如果代码仅运行一次,它会给出正确的结果,但是我想运行几次,因此将代码放入for循环中。问题是只有前两个循环会生成我期望的结果。对于其余的循环,结果始终为0,这似乎是线程安全的。Java虚拟机中是否有任何内部运算符导致这种情况?

我尝试过更改循环数,而第一个或第二个总是我期望的,但是无论有多少个循环,其他的都是0。

计数器:

private static class Counter {
    private int count;

    public void increase() {
        count++;
    }

    public void decrease() {
        count--;
    }

    public int getCount() {
        return count;
    }
}
Run Code Online (Sandbox Code Playgroud)

人:

// This is just a thread to increase and decrease the counter for many times.
private static class Person extends Thread {
    private Counter c;

    public Person(Counter c) {
        this.c = c;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100000; i++) { …
Run Code Online (Sandbox Code Playgroud)

java multithreading thread-safety

33
推荐指数
3
解决办法
2235
查看次数

在 C++ 中两次删除 nullptr 是否安全?

我在 CPPCon 上看过一个演讲,back to basic: class layout链接是这个。在 54:20,他说两次删除 nullptr 是未定义的行为。据我所知,C++ 标准保证删除 nullptr 没有任何作用,但为什么删除 nullptr 两次是未定义的行为?

之前有人告诉我,不需要检查析构函数中的 ptr 是否为空,因为删除空指针是有效的。但是如果两次删除一个空指针是未定义的,这是否意味着我仍然需要检查它是否为 nullptr 以防止发生双重删除?

这是作者从他的视频中的转录:

[...] 忽略标准,然后又遇到了问题。我看到的一个常见示例是可以删除空指针,这很好,但是如果不将值重置为某个有效指针值,就不能删除它两次。如果我删除相同的指针两次,如果它不是空的,你可能会得到一个段错误,如果它是空的,它通常只是碰巧工作,但不能保证工作,实际上在 1980 年代有一个编译器在那里它不会工作,因为当您删除指针时,删除的指针中会覆盖一个新值。因此,再次遵循标准。

c++

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

如何从 Rust 中的 Arc 和 Mutex 中包装的 Hashmap 中返回对值的引用?

我在返回 a 中的值的引用时遇到了一些麻烦,HashMap<String,String>该值由 Arc 和 Mutex 包装以在线程之间共享。代码是这样的:


use std::sync::{Arc,Mutex};
use std::collections::HashMap;

struct Hey{
    a:Arc<Mutex<HashMap<String, String>>>
}


impl Hey {
    fn get(&self,key:&String)->&String{
        self.a.lock().unwrap().get(key).unwrap()
    }
}

Run Code Online (Sandbox Code Playgroud)

如上所示,代码由于returns a value referencing data owned by the current function. 我知道lock()返回 MutexGuard 这是一个局部变量。但是我怎样才能实现这种方法来获取对 HashMap 中的值的引用。如果我不能,Rust 禁止这样做的动机是什么?

rust

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

是否需要`void_t`来检查一个类是否有一个具有特定签名的方法?

当我第一次学习如何检查课程中的特定签名时,我被教导使用std::void_t并编写如下代码:

template<typename T, typename =void>
class HAS:public false_type{};

template<typename T>
class HAS<T,void_t<decltype(declval<T>().print())>>:public true_type{};
Run Code Online (Sandbox Code Playgroud)

这段代码将检查一个类是否有名为" print()" 的方法.它运作良好.

但当我试图删除它时std::void_t,它仍然有效.

代码如下所示:

template<typename T, typename = void>
class HAS:public false_type{};

template<typename T>
class HAS<T,decltype(declval<T>().print())>:public true_type{};
Run Code Online (Sandbox Code Playgroud)

所以我很困惑,如果需要" std::void_t"来检查一个类是否有一个具有特定签名的方法?或者那只是巧合?

c++ templates template-meta-programming c++11 c++17

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

我应该在 Rust 中尽可能避免使用 Rc 和 RefCell 吗?

Rust 在编译时提供借用检查。但如果使用Rcand RefCell,检查将在运行时推迟,并且当程序违反规则时将引发恐慌。像这样:

use std::rc::Rc;
use std::cell::RefCell;

fn func1(reference: Rc<RefCell<String>>){
    let mut a = reference.borrow_mut();
    *a = String::from("func1");
    func2(reference.clone());
}

fn func2(reference: Rc<RefCell<String>>){
    let mut a = reference.borrow_mut();
    *a = String::from("func2");
    func3(reference.clone());
}

fn func3(reference: Rc<RefCell<String>>){
    let mut a = reference.borrow_mut();
    *a = String::from("func3");
}


fn main() {
    let a = Rc::new(RefCell::new(String::from("hello")));
    func1(a.clone());
}

Run Code Online (Sandbox Code Playgroud)

这段代码仍然将错误(也许不是错误)留给运行时并陷入恐慌。那么我应该尽可能避免使用Rcand吗?RefCell这段代码算安全代码吗?

rust

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

如何使用CMake项目在Qt Creator中添加一个类?

我曾经用Visual Studio编写代码,这很容易添加一个类.最近,我转而使用Qt Creator编写纯C++项目,添加类总是有问题.代码如下:

#include <iostream>
#include "hello.h"

using namespace std;

int main()
{
    Hello H;
    H.say();
    cout << "Hello World!" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个名为Hello的类并将其包含在main.cpp中,但是当我编译它时,会发生一些错误.

在此输入图像描述

那么如何使用QT创建者添加一个类?提前致谢!

c++ qt cmake

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

为什么 Java 可以在不花费时间的情况下运行代码?

我编写了一个小程序来生成唯一 ID。并打印出时间成本。这是代码:


public class JavaSF_OLD {

    static int randomNumberShiftBits = 12;
    static int randomNumberMask = (1 << randomNumberShiftBits) - 1;
    static int machineNumberShiftBits = 5;
    static int machineNumberMask = (1 << machineNumberShiftBits) - 1;
    static int dataCenterNumberShiftBits = 5;
    static int dataCenterNumberMask = (1 << dataCenterNumberShiftBits) - 1;
    static int dateTimeShiftBits = 41;
    static long dateTimeMask = (1L << dateTimeShiftBits)-1;

    static int snowFlakeId = 0;
    static long lastTimeStamp = 0;
    static int DataCenterID = 1;
    static int MachineID = 1; …
Run Code Online (Sandbox Code Playgroud)

c++ java

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

modding 1024 真的比 modding 1023 快吗?

我的同事告诉我,代码修改 2 的功能将针对位操作进行优化,并且比修改其他数字更快。我检查了装配体,证明了他的选择。但我用 Golang 编写了一个基准代码并使用 Go 版本 1.17 运行它。似乎并没有太大的区别。为什么会发生这种事?他是对的吗?

这是 Golang 代码:

package main

import (
    "fmt"
    "time"
)

const loop = 10000000000

func Mod1024() int {
    sum := 0
    for i := 0; i < loop; i++ {
        sum += i % 1024
    }
    return sum
}

func Mod1023() int {
    sum := 0
    for i := 0; i < loop; i++ {
        sum += i % 1023
    }
    return sum
}

func main() {
    start := time.Now()
    Mod1023() …
Run Code Online (Sandbox Code Playgroud)

go modulo

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