- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
0000000000\n"; write(fd, msg, strl-6ren">
如果我有两个线程,thread0
和thread1
。thread0
可以:
const char *msg = "thread0 => 0000000000\n";
write(fd, msg, strlen(msg));
thread1
可以:
const char *msg = "thread1 => 111111111\n";
write(fd, msg, strlen(msg));
thread0 => 000000111
thread1 => 111111000
最佳答案
首先,请注意,您的问题是“是否将对数据进行交织?”,而不是“是否write()
调用[需要]是原子的?”这些是不同的问题...
“TL; DR”摘要:
小于或等于write()
字节的管道或FIFO中的
PIPE_BUF
不会被交错write()
对其他任何内容的调用将介于“可能不会被交错”到“永远不会被交错”与“几乎肯定不会被交错”到“赢得”的大多数实现之间的范围内。永远不会被交错”范围。 write()
或更少字节的
PIPE_BUF
调用,您的数据将完全不会被交织。
write()
(请注意粗体部分):
RATIONALE
...
An attempt to write to a pipe or FIFO has several major characteristics:
Atomic/non-atomic: A write is atomic if the whole amount written in one operation is not interleaved with data from any other process. This is useful when there are multiple writers sending data to a single reader. Applications need to know how large a write request can be expected to be performed atomically. This maximum is called {PIPE_BUF}. This volume of POSIX.1-2008 does not say whether write requests for more than {PIPE_BUF} bytes are atomic, but requires that writes of {PIPE_BUF} or fewer bytes shall be atomic.
...
PIPE_BUF
字节以内。
If the O_APPEND flag of the file status flags is set, the file offset shall be set to the end of the file prior to each write and no intervening file modification operation shall occur between changing the file offset and the write operation.
write()
调用?
write()
系统调用的大多数实现都将使用相同的代码来执行附加模式和“正常”
write()
调用的实际数据写入-以及
pwrite()
调用。唯一的区别是所使用的偏移量的来源-对于“正常”的
write()
调用,所使用的偏移量将是当前文件的偏移量。对于追加
write()
调用,使用的偏移量将是文件的当前结尾。对于
pwrite()
调用,使用的偏移量将由调用方提供(除非Linux损坏-它使用当前文件大小而不是提供的offset参数作为在追加模式下打开的文件上
pwrite()
调用的目标偏移量。请参见“BUGS”
the Linux pwrite()
man page.的部分)
write()
调用。
The
write()
function shall attempt to writenbyte
bytes ...
write()
部分结果。但是即使那样,确实要写入的数据也必须是原子写入的。
write()
的几率是多少?这取决于您要写的内容。我从未见过磁盘填充以外的文件的部分
write()
结果或实际的硬件故障。甚至是部分
read()
结果。我无法看到
write()
操作的所有方式,该操作将所有数据都存储在内核内存中的单个页面上,从而导致除了磁盘已满或发生硬件故障以外的其他任何原因,导致部分
write()
出现。
write()
操作实际上是原子的。
write()
调用进行单线程处理,以确保它可以满足写入的原子性要求。管道并附加到文件。
关于c - 多线程会做write()交错吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43648347/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!