我正在寻找一种方法来实现支持单个生产者和多个消费者的无锁队列数据结构.我看过Maged Michael和Michael Scott(1996)的经典方法,但他们的版本使用链表.我想要一个使用有界循环缓冲区的实现.什么东西使用原子变量?
另外,我不确定为什么这些经典方法是为需要大量动态内存管理的链表设计的.在多线程程序中,所有内存管理例程都是序列化的.我们不是通过将它们与动态数据结构结合使用来破坏无锁方法的好处吗?
我试图在英特尔64位架构上使用pthread库在C/C++中编写代码.
谢谢Shirish
在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的正确方法是什么?
在JavaScript中增量是一个原子操作吗?如果一个线程正在访问++i;
,同时另一个线程
开始访问该操作会有任何问题吗?
以下程序在偶尔打印“坏”输出时给了我意想不到的行为。这两个线程应该使用两个 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) 我有一个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过程中没有抱怨.
有人知道我错过了什么吗?
谢谢马特
当我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) 在下面的代码中,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) 下面的代码几乎与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) 我有一个包含相关依赖项的目标的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.
我有一个大型uint8_t
数组(大小= 1824 * 942)。我想对每个元素执行相同的操作。特别是我需要从每个元素中减去-15。
该阵列每秒刷新20次,因此时间是个问题,我避免在阵列上循环。
是否有捷径可寻?
我有一个类似的功能
FILE *file1 = fopen("testing.txt", "r");
Run Code Online (Sandbox Code Playgroud)
我不能修改这一行.但是,如果我创建一个名为"testing.txt"的文件,比如说/tmp
,我能够使该函数加载文件/tmp
而不是它自己的目录.(也许通过修改PATH
变量?)
除了包含第三方软件之外,为什么要为项目创建静态库.如果您自己编写源代码,那么您可以将其构建为项目的一部分,如果它是一个不止一次使用的库,那么动态链接和坐在运行时库上会不会更有意义?