小编Max*_*kin的帖子

锁定免费队列 - 单一生产者,多个消费者

我正在寻找一种方法来实现支持单个生产者和多个消费者的无锁队列数据结构.我看过Maged Michael和Michael Scott(1996)的经典方法,但他们的版本使用链表.我想要一个使用有界循环缓冲区的实现.什么东西使用原子变量?

另外,我不确定为什么这些经典方法是为需要大量动态内存管理的链表设计的.在多线程程序中,所有内存管理例程都是序列化的.我们不是通过将它们与动态数据结构结合使用来破坏无锁方法的好处吗?

我试图在英特尔64位架构上使用pthread库在C/C++中编写代码.

谢谢Shirish

c++ queue atomic lock-free

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

makefile中的版本号比较

在makefile中,我想定义一个变量,指定当前的redhat-release是否大于5.3.(此变量将作为#define传递给gcc)

到目前为止,我想出了:

# Find out which version of Red-Hat we're running
RH_VER_NUM = $(shell /bin/grep -o [0-9].[0-9] /etc/redhat-release)
RH_GT_5_3 = $RH_VER_NUM > '5.3'
Run Code Online (Sandbox Code Playgroud)

定义RH_GT_5_3的正确方法是什么?

makefile gnu-make

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

在JavaScript中增量是一个原子操作吗?

在JavaScript中增量是一个原子操作吗?如果一个线程正在访问++i;,同时另一个线程 开始访问该操作会有任何问题吗?

javascript multithreading atomic thread-safety

10
推荐指数
3
解决办法
3933
查看次数

c++ std::atomic 变量的线程同步问题

以下程序在偶尔打印“坏”输出时给了我意想不到的行为。这两个线程应该使用两个 std::atomic 变量“s_lock1”和“s_lock2”进行同步。在 func2 中,为了将 's_var' 变量设置为 1,它必须在 's_lock2' 中原子地存储一个非零值,并且另一个线程 (func1) 必须尚未更新 's_lock1' 变量。然而,在 func1 中,它以某种方式打印了意外的“坏”输出。s_lock2.load() 语句似乎返回 false。这个代码片段有什么问题吗?这是与内存排序有关的问题吗?

我在安装了 Centos 7 的 8 核 Linux 服务器上运行它。任何帮助是极大的赞赏。

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

std::atomic_uint s_lock1 = 0;
std::atomic_uint s_lock2 = 0;
std::atomic_uint s_var = 0;

static void func1()
{
    while (true) {
        s_lock1.store(1, std::memory_order_release);
        if (s_lock2.load(std::memory_order_acquire) != 0) {
            s_lock1.store(0, std::memory_order_release);
            continue;
        }
        if (s_var.load(std::memory_order_acquire) > 0) {
            printf("bad\n");
        }
        usleep(1000);
        s_lock1.store(0, std::memory_order_release);
    }
}

static void func2()
{ …
Run Code Online (Sandbox Code Playgroud)

atomic c++11

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

Makefile - 找不到共享库

我有一个c ++ Linux项目的Makefile:

MODE ?= dbg
DIR = ../../../../../somdir/$(MODE)

SRC_FILES = a.cpp b.cpp
H_FILES = a.h

LDFLAGS += -L$(DIR)/lib/linux '-Wl,-R$$ORIGIN'
CPPFLAGS = -I$(DIR)/include
LIBRARIES = -lsomeso

ifeq (rel, $(MODE))
  CFLAGS = -Wall -g -DNDEBUG
else
  CFLAGS = -Wall -ansi -pedantic -Wconversion -g -DDEBUG -D_DEBUG
endif

sample: $(SRC_FILES) $(H_FILES) Makefile
    g++ $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(LIBRARIES) $(SRC_FILES) -o sample
Run Code Online (Sandbox Code Playgroud)

当我运行'make'时,它会构建项目,没有错误.但当我运行该项目时,它抱怨说:

error while loading shared libraries: libsomeso.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我在DIR中提供的路径转到保存共享对象的文件夹(相对于放置makefile的位置),如果它是错误的路径,为什么它在make过程中没有抱怨.

有人知道我错过了什么吗?

谢谢马特

c++ linux makefile

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

抛出“std::system_error”实例后调用终止

当我std::call_once在 Linux 2.6.36 版中使用时,出现错误:

terminate called after throwing an instance of 'std::system_error'
what(): Unknown error -1
Aborted
Run Code Online (Sandbox Code Playgroud)

编译命令:

mipsel-buildroot-linux-uclibc-g++ callonce.cpp -o callonce -static -lpthread
Run Code Online (Sandbox Code Playgroud)

我的代码:

#include <iostream>
#include <mutex>
using namespace std;
int main()
{
    cout << "Hello world" << std::endl;
    static once_flag of;
    call_once(of,[]{});

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading libstdc++ c++11

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

从C++中的另一个线程读取指针

在下面的代码中,x由于原子线程围栏,线程2中的值将始终为10.

int x;
atomic<bool> b(false);

// thread 1:
x = 10;
atomic_thread_fence(memory_order_release);
b = true;

// thread 2:
while(!b){}
atomic_thread_fence(memory_order_acquire);
assert(x == 10); // x will always be 10
Run Code Online (Sandbox Code Playgroud)

但是在下面的代码中,*x线程2中的总是10?

int* x = new int;
atomic<bool> b(false);

// thread 1:
*x = 10;
atomic_thread_fence(memory_order_release);
b = true;

// thread 2:
while(!b){}
atomic_thread_fence(memory_order_acquire);
assert(*x == 10); // will *x always be 10?
Run Code Online (Sandbox Code Playgroud)

c++ multithreading pointers atomicity

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

为什么一个简单的python生产者/消费者多线程程序不会通过添加工作者数量来加速?

下面的代码几乎与http://docs.python.org/2/library/queue.html上的python官方Queue示例相同.

from Queue import Queue
from threading import Thread
from time import time
import sys

num_worker_threads = int(sys.argv[1])
source = xrange(10000)

def do_work(item):
    for i in xrange(100000):
        pass

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()

for item in source:
    q.put(item)

start = time()

for i in range(num_worker_threads):
    t = Thread(target=worker)
    t.daemon = True
    t.start()

q.join()

end = time()

print(end - start)
Run Code Online (Sandbox Code Playgroud)

这些是Xeon 12核处理器的结果:

$ ./speed.py 1
12.0873839855

$ ./speed.py 2
15.9101941586

$ ./speed.py …
Run Code Online (Sandbox Code Playgroud)

python queue multithreading producer-consumer

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

Makefile目标依赖项中的变量替换

我有一个包含相关依赖项的目标的Makefile.所以我使用查找表,如:

APPS = a b c

dependency.lookup.a := x
dependency.lookup.b := y
dependency.lookup.c := z

$(APPS): %: path/$(dependency.lookup.%).datafile
    do something with $(dependency.lookup.$@)
Run Code Online (Sandbox Code Playgroud)

这个makefile给了我错误.***没有规则来制作目标'path/.datafile'

约束:只有MinGW.不能使用shell/MSYS.也支持FreeBSD.

makefile gnu-make

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

减去或添加常数到大型数组

我有一个大型uint8_t数组(大小= 1824 * 942)。我想对每个元素执行相同的操作。特别是我需要从每个元素中减去-15。

该阵列每秒刷新20次,因此时间是个问题,我避免在阵列上循环。

是否有捷径可寻?

c++ arrays math pointer-arithmetic integer-arithmetic

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

使fopen()从某个目录中打开文件

我有一个类似的功能

FILE *file1 = fopen("testing.txt", "r");
Run Code Online (Sandbox Code Playgroud)

我不能修改这一行.但是,如果我创建一个名为"testing.txt"的文件,比如说/tmp,我能够使该函数加载文件/tmp而不是它自己的目录.(也许通过修改PATH变量?)

c shell

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

C++静态库

除了包含第三方软件之外,为什么要为项目创建静态库.如果您自己编写源代码,那么您可以将其构建为项目的一部分,如果它是一个不止一次使用的库,那么动态链接和坐在运行时库上会不会更有意义?

c++ dll linker shared-libraries static-libraries

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