小编bro*_*s94的帖子

如何在C中实现无锁共享标志?

我有一个生产者一个消费者模型,我需要生产者在数据可用时设置一个标志.我怀疑我可以在没有锁定共享标志的情况下离开,因为:

  • 生产者在设置之前从不检查该值
  • 偶尔错过对标志的更新不是问题(虽然我可能也可以使用原子操作来避免这种情况?).

所以我的问题是,我该如何实现呢?我对volatile关键字的理解,以及像__sync_synchronize()这样的事情充其量是微不足道的,所以假设我知之甚少.具体来说,我希望能够确保在其他线程中及时看到对标志的更改.

编辑:我在Linux上使用GCC.

c sync lock-free

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

将64位寄存器的前32位置零

使用amd64汇编,最好的方法是将64位寄存器的前32位清零,例如将未覆盖的rax位清零?似乎我不能和整个寄存器对64位常数.

assembly x86-64 machine-language

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

函数指针中的最低有效位

我正在玩一个编程语言实现,我想知道如何(生病)建议它按下函数指针的最低有效位来存储数据.

是否有任何主要平台(AMD64/{Windows/Linux/MacOS},Arm/{iOS,Android}),其中2个最低有效位在函数指针中是非零的?也就是说,主要平台上的代码对齐至少为4?

c compiler-construction cpu assembly pointers

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

C:如何摆脱转换错误?

我有一个使用gcc版本4.6.3的项目,我被迫使用"-Wall -Werror -Wconversion"进行编译.以下简单示例显示了我无法摆脱的错误:

#include <stdint.h>

int main(void) {
  uint32_t u = 0;
  char c = 1;

  u += c;
  return (int)u;
}
Run Code Online (Sandbox Code Playgroud)

用上面的标志编译它给出:

test.c:7:8: error: conversion to ‘uint32_t’ from ‘char’ may change the sign of the result [-Werror=sign-conversion]
Run Code Online (Sandbox Code Playgroud)

好的.只需添加一个类型转换,对吗?不.将第7行更改为u += (uint32_t)c不会使错误消失.即使改变它u = u + (uint32_t)c也不会让它消失.

有可能解决这个问题吗?

请注意,"char"来自字符串,因此我无法更改其类型.

c gcc casting

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

ZeroMQ和本地FIFO

我有两个进程('发送者'和'接收者')需要通过瞬态单向FIFO通信管道进行通信,本地在一台机器上.这就是我想要发生的事情(使用更接近Unix域套接字的语言):

  • 发件人在众所周知的地址"创建"管道,并立即向其发送消息
  • 在某些时候(发送者"创建"管道之前或之后),接收器连接到管道
  • Reader从管道中读取消息
  • 发件人"关闭"管道
  • Reader注意到所有消息都已被读取(可能是管道已关闭)

我的问题是:如何使用ZeroMQ实现这一点?"PUB/SUB","PUSH/PULL"?在ZMQ套接字中检测"数据结束"的机制是什么?是否可以允许上述前两项的两个排序:即发送方或接收方是否首先尝试连接?如果是这样,怎么样?

谢谢.

zeromq

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

我如何使用可变载体编写imapInto?

这与这个问题有关:

不知道从哪里开始使用可变向量

我如何编写一个从一个向量中获取值,转换它们并将结果放入第二个向量的函数?更具体地说,它应该迭代源数组的所有索引,并将该索引和数组交给函数,然后将函数的结果存储在另一个数组中.

我认为签名看起来像这样:

imapInto :: (PrimMonad m, Unbox a) => (MVector (PrimState m) a -> Int -> a) -> MVector (PrimState m) a -> MVector (PrimState m) a  -> m ()
Run Code Online (Sandbox Code Playgroud)

会被称为这样的东西:

import Data.Vector.Unboxed.Mutable MV

...
let dst = MV.replicate 10 0.0 in
let src = MV.replicate 10 1.0 in
imapInto (\src' i -> (src' * 2.0)) dst src
...
Run Code Online (Sandbox Code Playgroud)

这会将src中的所有元素乘以2并将结果放入dst,从而产生一个状态单元.

haskell

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

综合理解的地位是什么?

这个提议的功能看起来非常酷,该页面有一个诱人的断言:"2007年12月20日被整合到GHC HEAD分支".

但我找不到其他相关内容.现状是什么?如果它不是标准分布的一部分,那么简洁地实现相同目标的最佳方法是什么?

haskell list-comprehension

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

Haskell:如何将多个实例放在同一个模块中?

假设我有以下代码:

import Data.List.Ordered

data Person = Person String String
     deriving (Show, Eq)

main :: IO ()
main = print . show . sort $ [(Person "Isaac" "Newton"), (Person "Johannes" "Kepler")]
Run Code Online (Sandbox Code Playgroud)

在同一个模块中,我希望能够按名字和姓氏对列表进行排序.显然我不能这样做:

instance Ord Person where
         compare (Person _ xLast) (Person _ yLast) = compare xLast yLast

instance Ord Person where
         compare (Person xFirst _) (Person yFirst _) = compare xFirst yFirst
Run Code Online (Sandbox Code Playgroud)

那么,我的选择是什么?

此页面提到"您可以通过将类型包装在新类型中并将所有必需实例提升到该新类型来实现此目的." 有人能给出一个例子吗?

有没有更好的办法?

haskell

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

将共享库链接到静态库

我有两个基于 autotools 的项目 AAA 和 BBB:

  • AAA 是用“--enable-static --disable-shared”构建的,所有代码都是用 C 编写的
  • BBB 是一个动态库,并使用“libBBB_la_LIBADD = /path/to/libAAA.a”链接到 AAA

尝试编译 BBB 时,我收到以下信息:

/usr/bin/ld: /usr/local/lib/libAAA.a(liboAAA_la-foo.o): relocation R_X86_64_PC32 against undefined symbol `malloc@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
Run Code Online (Sandbox Code Playgroud)

作为参考,产生错误的实际命令是:

gcc -shared  -fPIC -DPIC  .libs/libBBB_la-BBB.o .libs/libBBB_la-hash.o .libs/libBBB_la-vl_helpers.o   -lm -L/usr/local/lib /usr/local/lib/libAAA.a  -O3   -Wl,-soname -Wl,libBBB.so.0 -o .libs/libBBB.so.0.0.0
Run Code Online (Sandbox Code Playgroud)

我做错了什么,我该如何进行这项工作?

c linker autotools ld libtool

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

我可以让OCaml在未捕获的异常上产生堆栈跟踪吗?

在Java中,当异常转义main()函数时,会向控制台打印堆栈跟踪.你能让OCaml程序做同样的事情吗?

ocaml

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

这个布尔定律叫什么?

我认为这总是如此

x || (x && y) 
Run Code Online (Sandbox Code Playgroud)

相当于

x
Run Code Online (Sandbox Code Playgroud)

如果是这样,那法律叫什么?我甚至不确定谷歌会如何做到这一点.

logic boolean-logic boolean boolean-expression first-order-logic

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

什么是BaseMosaic(NVidia/X11)

我在NVidia X Server Settings小程序和我的xorg.conf中看到对BaseMosaic的引用,但我找不到它的好描述.它是什么,它做了什么?

x11 gpu nvidia xorg

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