根据Linux内核中的,
all users of atomic_t should treat atomic_read() and atomic_set() as simple
C statements that may be reordered or optimized away entirely by the compiler
or processor, and explicitly invoke the appropriate compiler and/or memory
barrier for each use case. Failure to do so will result i
在信号处理程序中使用sem_post()是否依赖于未定义的行为?
/*
* excerpted from the 2017-09-15 Linux man page for sem_wait(3)
* http://man7.org/linux/man-pages/man3/sem_wait.3.html
*/
...
sem_t sem;
...
static void
handler(int sig)
{
write(STDOUT_FILENO, "sem_post() from handler\n", 24);
if (sem_post(&
我正在开发一个Linux应用程序,它需要能够处理大量的信号。尽管信号处理程序将运行得很快(我最多计划了数千个cpu周期),但信号将以大突发的形式出现,理想情况下,我将完全禁用信号掩蔽(即使不是主题,参见SA_NODEFER in )。
因此,我需要以完全可重入的方式实现信号处理程序。我认为std::原子对这个任务是有用的,但是我认为,std::原子是为了处理基于线程的争用条件而开发的,而不一定是从信号处理程序堆叠而来的争用问题。
在一个在GNU/Linux中用GCC编译的C程序中,使用非原子和非易失性变量在线程之间共享数据(如果使用这些变量的线程是通过原子负载和存储来同步的话)是否安全(从意义上说它不会引入意外行为)?如果没有,我应该用什么代替呢?
对于示例,GCC是否保证以下代码将按预期工作(thread_2总是返回1)?假设两个函数都是从不同的线程调用的。如果使用C11原子原语编写,如果使用POSIX线程互斥进行同步,还是使用POSIX信号量,则会有什么不同吗?我只将以下代码作为特定情况包括在内。
int data = 0;
int flag = 0;
int thread_1 (void) {
data
我找到了一个在linux中可以在g++下再现的竞赛条件的例子。在这个例子中,我不明白操作的顺序是如何重要的。
int va = 0;
void fa() {
for (int i = 0; i < 10000; ++i)
++va;
}
void fb() {
for (int i = 0; i < 10000; ++i)
--va;
}
int main() {
std::thread a(fa);
std::thread b(fb);
a.join();
b.join();
std::
我正在将一个运行在linux上的项目迁移到linux,并且需要消除一些{disable,enable}_scheduler调用。:)
因此,我需要一个没有锁的同步解决方案,在一个单一的作家,多读取器场景,其中的写入线程不能被阻止。我想出了以下解决方案,它不适合通常的获取-发布命令:
class RWSync {
std::atomic<int> version; // incremented after every modification
std::atomic_bool invalid; // true during write
public:
RWSync
关于在linux内核中使用循环缓冲区宏,我有一个问题。
我正在尝试使用include/linux/circ_buf.h中的循环缓冲区宏。
ACCESS_ONCE()宏用于确保编译器将从内存中读取值,而不是试图优化访问。
在循环缓冲区的文档中,给出了以下代码作为生成器的示例:
spin_lock(&producer_lock);
unsigned long head = buffer->head;
/* The spin_unlock() and next spin_lock() provide needed ordering. *
让我们假设如下:
我在Linux / Mac上有两个进程。
我在共享内存(或文件中)上有mmap。
然后,在这两个过程中,我有以下几点:
struct Data{
volatile int reload = 0; // using int because is more standard
// more things in the future...
};
void *mmap_memory = mmap(...);
Data *data = static_cast<Data *>(mmap_memory); // suppose size is sufficient
我们能从不同的线程安全地读取/更新布尔值吗?我的意思是这个行动是原子的吗?我想知道所有平台(android、ios、macos、linux、windows)都是这样的
我想要做的是使用一个布尔变量作为一个标志。类似于:
var isempty: boolean;
::thread x
if not isempty then begin .... isempty := true; end;
...
::thread y
isempty := false:
我知道:
读和写对于引用变量和大多数原始变量(除了长和双)都是原子的。对于所有声明为可变变量(包括长变量和双变量),读和写都是原子的。
但是我想知道长、长、双、双等变量是自动装箱还是反装箱,读写操作是原子的吗?
例如:
private Long a;
private long b;
private Double c;
private double d;
a = 2; //is this operation atomic?
b = a; //is this operation atomic?
d = 3;
c = d; //is this