多个线程可以对数组中的不同字节进行“原子”无锁写入吗?

éta*_*ogy 1 c linux parallel-processing multithreading pthreads

N线程是否可以kx-bit 元素的数组中M xN最多M)对-bit 元素的长度不重叠的间隔进行“原子”无锁写入?

例如。假设N10M10k是 1 并且x8

然后我们有10线程,一个10字节数组,每个线程将1字节写入数组。(每个线程写入不同的字节,因为根据假设,间隔是不重叠的。)


这是一个测试这是否可能的程序,或者一个线程是否“踩到邻居的脚趾”。

/*
t gcc-8  bytes1.c -o bytes1  -lpthread  &&  t ./bytes1
*/
#include <stdint.h>
typedef  uint8_t   u8;
typedef  int32_t  i32;
typedef  int64_t  i64;

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

// ----------------------------------------------------------------------------------------------------------------------------#
/* @blk1  test if multiple threads can do 1-byte aligned lockfree atomic writes to an array! */
#define THRS_TEST_LOCKFREE_WRITES_DX    0x20
#define THRS_TEST_LOCKFREE_WRITES_TMUL  2  // thread multiplier (for the numbre of threads)!

typedef struct{
  i32       idx;
  i32       tdim;
  pthread_t pthr;

  i32       dx;
  u8*       g_data;
}thr_t;

void* thr_test_lockfree_write(void* arg){
  thr_t* thr = (thr_t*)arg;
  for(int i=0; i<thr->dx; ++i)
    thr->g_data[thr->idx*thr->dx + i] = thr->idx;
  return NULL;
}

void thrs_test_lockfree_writes(){
  i32    thrs_idim = THRS_TEST_LOCKFREE_WRITES_TMUL * sysconf(_SC_NPROCESSORS_ONLN);
  thr_t* thrs      = alloca(sizeof(thr_t)*thrs_idim);
  i32    x_dx      = THRS_TEST_LOCKFREE_WRITES_DX;
  i64    x_idim    = x_dx*thrs_idim;
  u8*    x_data    = aligned_alloc(0x1000, sizeof(u8)*x_idim);

  for(int i=0; i<thrs_idim; ++i){
    thrs[i].idx    = i;
    thrs[i].tdim   = thrs_idim;
    thrs[i].dx     = x_dx;
    thrs[i].g_data = x_data;
    pthread_create(&thrs[i].pthr, NULL, thr_test_lockfree_write, &thrs[i]);
  }

  for(int i=0; i<thrs_idim; ++i){
    pthread_join(thrs[i].pthr, NULL);
  }

  putchar(0x0a);
  for(int i=0; i<x_idim/x_dx; ++i){
    printf("\x1b[32m%02x\x1b[91m/\x1b[37m%02x  \x1b[0m", i,thrs_idim-1);
    i32 flag = 1;
    for(int j=0; j<x_dx; ++j){
      printf("%02x", x_data[i*x_dx+j]);
      flag &= x_data[i*x_dx+j]==i%0x100;
    }
    printf(" %d\n",flag);
  }

  free(x_data);
}

// ----------------------------------------------------------------------------------------------------------------------------#
int main(){
  thrs_test_lockfree_writes();
  puts("\nbye!");
}
Run Code Online (Sandbox Code Playgroud)

Emp*_*ian 6

N 个线程可以执行“原子”无锁写入吗

在可以将单个字节写入内存的体系结构上(所有现代体系结构),是的。

另请参阅此答案,并注意由于错误共享,您的程序实际实现的并行度将远低于人们的预期。