小编Zih*_*Liu的帖子

可以通过其他获取操作获取负载重新排序吗?cppreference 说只有非原子的和宽松的通过 acquire 排序

根据C++ Referencemutex.lock()是一个memory_order_acquire操作,并且mutex.unlock()是一个memory_order_release操作。

然而,memory_order_acquirememory_order_release只对非原子和宽松原子操作有效。

memory_order:释放-获取cppreference 上的排序

如果线程 A 中的原子存储被标记memory_order_release,并且线程 B 中来自同一变量的原子加载被标记memory_order_acquire,则从线程 A 的角度来看,所有内存写入(非原子和宽松原子)发生在原子存储之前,在线程 B 中变得可见的副作用

C++中的互斥体能否保证原子操作的可见性?示例如下。代码可以A在 , 之前重新排序mu.lock(),并且线程bx为 吗false


#include <thread>
#include <atomic>
#include <cassert>
#include <iostream>
#include <unistd.h>

std::atomic<bool> x = {false};
std::mutex mu;

void write_x(){
  mu.lock();
  std::cout << "write_x" << std::endl;
  x.store(true, std::memory_order_release);
  mu.unlock();
}

void read_x() {
  mu.lock();
  std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ mutex atomic memory-model stdatomic

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

golang 中 os.File.Write() 线程安全吗?

当两个 Goroutine 同时写入文件时,线程安全吗os.File.Write()

根据这个问题Is os.File's Write() threadsafe? ,它不是线程安全的。./test.txt然而,以下代码的输出文件并没有出现错误。

根据这个问题,多个进程同时写入同一个文件是否安全?[CentOs 6, ext4],POSIX“原始”IO 系统调用是线程安全的。os.File.Write()使用 POSIX IO 系统调用,那么我们可以说它是线程安全的吗?

package main

import (
    "fmt"
    "os"
    "sync"
)

func main() {
    filePath := "./test.txt"

    var wg sync.WaitGroup
    wg.Add(2)

    worker := func(name string) {
        // file, _ := os.Create(filePath)
        file, _ := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE, 0666)
        defer file.Close()
        defer wg.Done()
        for i := 0; i < 100000; i++ {
            if _, err := file.Write([]byte(name + ": is os.File.Write() …
Run Code Online (Sandbox Code Playgroud)

linux multithreading posix go

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

C++11 中的默认复制赋值运算符何时使用按位复制而不是按成员复制?

在 x86-64 GCC 13.1 和 Clang 16.0.0 中,该copy<PrivateBase>函数使用成员方式复制,而该copy<PublicBase>函数使用按位复制。您可以参考编译器资源管理器上的详细源代码和汇编代码,或者查看下面提供的代码片段:

class PublicBase {
public:
    int num;
    char c1;
};

class PrivateBase {
private:
    int num;
    char c1;
};


template<typename T>
__attribute_noinline__ void copy(T *dst, T *src) {
    *dst = *src;
}

template void copy(PublicBase *dst, PublicBase *src);
template void copy(PrivateBase *dst, PrivateBase *src);
Run Code Online (Sandbox Code Playgroud)
void copy<PublicBase>(PublicBase*, PublicBase*):
        mov     rax, QWORD PTR [rsi]
        mov     QWORD PTR [rdi], rax
        ret
void copy<PrivateBase>(PrivateBase*, PrivateBase*):
        mov     eax, DWORD PTR [rsi]
        mov …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

标签 统计

c++ ×2

atomic ×1

c++11 ×1

go ×1

linux ×1

memory-model ×1

multithreading ×1

mutex ×1

posix ×1

stdatomic ×1