我见过使用pthread_cond_wait的典型模式是:
pthread_mutex_lock(&lock);
while (!test)
pthread_cond_wait(&condition, &lock);
pthread_mutex_unlock(&lock);
Run Code Online (Sandbox Code Playgroud)
为什么不能使用if语句而不是while循环.
pthread_mutex_lock(&lock);
if (!test)
pthread_cond_wait(&condition, &lock);
pthread_mutex_unlock(&lock);
Run Code Online (Sandbox Code Playgroud) 我有一个3d party python脚本,它从命令行获取输入.此脚本(input.py)中的相关代码如下所示:
import sys
def chooseinput():
valid_inputs = ('a', 'b')
inp = raw_input('Enter choice (%s): ' % "/".join(valid_inputs))
if inp not in valid_inputs:
sys.stderr.write("Unsupported input %s\n" % inp)
return
print 'You chose ' + '\'' + inp + '\''
return inp
if __name__ == "__main__":
chooseinput()
# do something with the input...
chooseinput()
# do something with the input...
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写另一个python脚本(harness.py)来生成上述脚本的输入.
import subprocess
def harness():
p = subprocess.Popen(['python', 'input.py'], stdin=subprocess.PIPE)
p.stdin.write('a')
p.stdin.write('b')
if __name__ == '__main__':
harness()
Run Code Online (Sandbox Code Playgroud)
从命令行,我运行:
$ python …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Android JellyBean上构建一个简单的内核模块.
码:
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_ALERT */
MODULE_LICENSE("GPL");
MODULE_AUTHOR("test");
MODULE_DESCRIPTION("Android ko test");
int init_module(void)
{
printk(KERN_ALERT, "Hello world\n");
// A non 0 return means init_module failed; module can't be loaded.
return 0;
}
void cleanup_module(void)
{
printk(KERN_ALERT "Goodbye world 1.\n");
}
Run Code Online (Sandbox Code Playgroud)
Makefile文件:
obj-m +=hello.o
KERNELDIR ?= ~/android/kernel
PWD := $(shell pwd)
CROSS_COMPILE=~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
ARCH=arm
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)
输出:
make …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,除非我将先前的状态传递给状态设置调用(“setForm”),否则表单不会正确更新。
要查看它的实际效果,请按原样运行代码,控制台将打印“true”,表明它有效。那是使用“validate1”函数。如果将其替换为“validate2”(不使用以前的状态),则无法打印“true”。
看起来在 validate2 中,由于这些调用的异步性质,第二个 setForm 调用会覆盖第一个 setForm 调用的 form.long 状态。但为什么 validate1 可以工作呢?为什么使用以前的状态会导致它起作用?任何有关此行为的文档都会非常有帮助。
(我可以通过使用一个设置两个字段的 setForm 来使 validate2 工作,但下面的代码旨在显示调用 setForm 的两种方式(有或没有先前状态)的差异。)
const {useState, useEffect} = React;
function LoginForm() {
const [form, setForm] = useState({
username: "",
password: "",
long: null
});
useEffect(() => {
console.log(form.long);
}, [form.long]);
const validate1 = (e) => {
e.preventDefault();
setForm((prevState) => ({
...prevState,
long: form.password.length >=3 ? true : false
}));
setForm((prevState) => ({
...prevState,
username: "*****"
}));
};
const validate2 = (e) => { …Run Code Online (Sandbox Code Playgroud)