Forwarded from dnaugsuz
异步本身就是在存在其它线程的情况下才有的啊,不是封装成回调就成全局单线程也有异步了
回调只不过是因为不能卡线程做的变通而已,要不然 WaitCondition 加个锁有何不可
回调只不过是因为不能卡线程做的变通而已,要不然 WaitCondition 加个锁有何不可
Forwarded from iseki 萍水相逢,相聚是缘|菜到开始学习
当然我的上下文中
线程 明确的指java.lang.ThreadForwarded from dnaugsuz
你上面的意思大概是说可以用调度器,本身线程也是操作系统内核调度接口的抽象而已
我的意思是,如果真的只是按顺序操作,没有事件进来,异步和多线程也能存在,Reactive 也能用,但没有任何意义,所以说没有多线程不用异步任务
我的意思是,如果真的只是按顺序操作,没有事件进来,异步和多线程也能存在,Reactive 也能用,但没有任何意义,所以说没有多线程不用异步任务
Forwarded from dnaugsuz
Forwarded from dnaugsuz
上面的意思是,我觉得不应该有任务调度器而都是 delay 回调嵌套的形式,毕竟这样没有额外修饰
即便有调度器,coroutine 的 suspend() 感觉比较没意思,因为 Int 量 i 是通过闭包存住的,既然是这样调度任务的话也就可以理解了
即便有调度器,coroutine 的 suspend() 感觉比较没意思,因为 Int 量 i 是通过闭包存住的,既然是这样调度任务的话也就可以理解了
Forwarded from dnaugsuz
我是不理解 Kotlin 到底是如何改进 coroutine 的既有特性的,在我的认知里协程就是能 suspend/resume 的普通程序而已,实现上就是 C#/ TypeScript ES6 的状态机化,但 Kotlin 显然不止于此。
delay 的话,如果只是避免回调地狱的 CPS 变换是肯定做不到预期的顺序的(会卡住其它协程的执行),一般的理解肯定是多线程,我是没想到 Kotlin 的协程还绑上了调度器特性,这么说它的 delay() 完全可以有特殊处理,相当于全局 timer 了
delay 的话,如果只是避免回调地狱的 CPS 变换是肯定做不到预期的顺序的(会卡住其它协程的执行),一般的理解肯定是多线程,我是没想到 Kotlin 的协程还绑上了调度器特性,这么说它的 delay() 完全可以有特殊处理,相当于全局 timer 了
Forwarded from Raid via @eva_zh_subtitle_bot
如果当前 dispatcher 没有实现 Delay, kotlin 会使用自己提供的 Delay, 那里头有个线程
Forwarded from dnaugsuz
这样也的确可以,但你的调度器必须实现抢占式调度啊,分配时间片结束得取得执行权🤔
这个就不得不依赖硬件的 timer 中断了
然后任务还要能保护现场、恢复现场,像个小协程 #coroutine 一样
要不然一个任务卡死了,调度也炸了
所以说平常还是不考虑用户级线程的情况比较好,都是谈操作系统的 Process和LWP
这个就不得不依赖硬件的 timer 中断了
然后任务还要能保护现场、恢复现场,像个小协程 #coroutine 一样
要不然一个任务卡死了,调度也炸了
所以说平常还是不考虑用户级线程的情况比较好,都是谈操作系统的 Process和LWP
Forwarded from dnaugsuz
你说的有道理,异步和并发是隔离的概念,虽然多线程库会提供异步接口,也有异步接口是不需要其它(JVM/OS)线程的,尽管这个概念在工业界经常被混淆
毕竟谁会真的拿应用线程去请求系统异步资源,慢慢异步就等于在其它线程调度了,唉
毕竟谁会真的拿应用线程去请求系统异步资源,慢慢异步就等于在其它线程调度了,唉
dnaugsuz
你说的有道理,异步和并发是隔离的概念,虽然多线程库会提供异步接口,也有异步接口是不需要其它(JVM/OS)线程的,尽管这个概念在工业界经常被混淆 毕竟谁会真的拿应用线程去请求系统异步资源,慢慢异步就等于在其它线程调度了,唉
刚才想了一会,觉得我们作为 编译原理/事件 的程序员,对并发的认知太薄弱了
认识不到线程是什么,一直觉得就是程序运行时始终存在、不会销毁的东西,它的任务完成后就直接变成 IDLE 状态等待事件,所以可以在异步信号来的时候能处理。
或者说一直就只有处理器I/O中断的那个认知,觉得就是不管什么程序序列(想了一下并行又没有顺序),肯定能抢占式执行而已。
想想也真是荒谬,如果线程在运行,它上面可能调度注册好的异步信号处理器?即便可以,那线程的独立性又有何意义?直接新建一个去执行不就好了?
所以说有事件队列啊,也不是说 event loop 是一个很难弄的东西,真的不甘心,我一直以为除了算法和绘制交互,自己已经了解的足够多(也不是没写过,两次。),其实还是什么都不懂。
认识不到线程是什么,一直觉得就是程序运行时始终存在、不会销毁的东西,它的任务完成后就直接变成 IDLE 状态等待事件,所以可以在异步信号来的时候能处理。
或者说一直就只有处理器I/O中断的那个认知,觉得就是不管什么程序序列(想了一下并行又没有顺序),肯定能抢占式执行而已。
想想也真是荒谬,如果线程在运行,它上面可能调度注册好的异步信号处理器?即便可以,那线程的独立性又有何意义?直接新建一个去执行不就好了?
所以说有事件队列啊,也不是说 event loop 是一个很难弄的东西,真的不甘心,我一直以为除了算法和绘制交互,自己已经了解的足够多(也不是没写过,两次。),其实还是什么都不懂。
Forwarded from dnaugsuz
噢,我明白了,其实是我一直不认为单线程用消息处理循环算是异步
我觉得异步是 IO 层面的(所以说浏览器JS也算多线程),这样的话肯定会有另外的程序流程(不管是不是内核里)在进行,共享了消息队列,不然它也不会莫名增长
这样的话异步就一定有其它线程了,除非IO中断打断了某线程后它还能恢复。
https://t.me/dsuse/15037
……想了想线程又名 LWP 好像的确是可以中断恢复( libc 的
我觉得异步是 IO 层面的(所以说浏览器JS也算多线程),这样的话肯定会有另外的程序流程(不管是不是内核里)在进行,共享了消息队列,不然它也不会莫名增长
这样的话异步就一定有其它线程了,除非IO中断打断了某线程后它还能恢复。
https://t.me/dsuse/15037
……想了想线程又名 LWP 好像的确是可以中断恢复( libc 的
signal(int, sighandler_t),这样的话单线程也能异步,感觉好绕。Telegram
duangsuse::Echo
刚才想了一会,觉得我们作为 编译原理/事件 的程序员,对并发的认知太薄弱了
认识不到线程是什么,一直觉得就是程序运行时始终存在、不会销毁的东西,它的任务完成后就直接变成 IDLE 状态等待事件,所以可以在异步信号来的时候能处理。
或者说一直就只有处理器I/O中断的那个认知,觉得就是不管什么程序序列(想了一下并行又没有顺序),肯定能抢占式执行而已。
想想也真是荒谬,如果线程在运行,它上面可能调度注册好的异步信号处理器?即便可以,那线程的独立性又有何意义?直接新建一个去执行不就好了?
所以说有事件队列啊,也不是说…
认识不到线程是什么,一直觉得就是程序运行时始终存在、不会销毁的东西,它的任务完成后就直接变成 IDLE 状态等待事件,所以可以在异步信号来的时候能处理。
或者说一直就只有处理器I/O中断的那个认知,觉得就是不管什么程序序列(想了一下并行又没有顺序),肯定能抢占式执行而已。
想想也真是荒谬,如果线程在运行,它上面可能调度注册好的异步信号处理器?即便可以,那线程的独立性又有何意义?直接新建一个去执行不就好了?
所以说有事件队列啊,也不是说…
Forwarded from Phonograph (Ralph 萌新喵)
终于明白「640K 内存能满足所有用户的需求」这个梗里面的「640K」是咋来的了。
在 DOS 环境下,0000:0000~9000:FFFF 是用户可用的内存空间,共640K.
在 DOS 环境下,0000:0000~9000:FFFF 是用户可用的内存空间,共640K.
#C :
也可以用 fputc:
这是横向的,当然也可以纵向:
#asm
.db fmt "%c%d\00"
_main:
push rbp
mov rbp, rsp
sub rsp, 4
mov [rbp-4], 0xFF
for:
mov rax, [rbp-4]
push rax
push rax
push fmt
call printf
dec rax
mov [rbp-4], rax
jnz for
for_out:
add rsp, 4
pop rbp
ret
#include <stdio.h>
void main(int argc, char** argv) {
for (int i=0; i<0xFF; i++) printf("%c%d", i, i);
}
也可以用 fputc:
void put(int i) {
fputc(stdout, (char) i);
int acc=i; while (acc!=0) {
fputc(stdout, '0'+acc%0xF);
acc /= 0xF;
}
}
这是横向的,当然也可以纵向:
void putTable(int nmax_col) {
int n=0xFF/nmax_col, m=nmax_col;
char ascii[n][m];
for (int j=0; j<m; j++) for (int i=0, i<n, i++) {
ascii[i][j] = (char)j*m+i;
}
for (int i=0, i<n, i++) for (int j=0; j<m; j++) {
char v=ascii[i][j]; printf("%c%d", v,v);
}
}
#asm
.db fmt "%c%d\00"
_main:
push rbp
mov rbp, rsp
sub rsp, 4
mov [rbp-4], 0xFF
for:
mov rax, [rbp-4]
push rax
push rax
push fmt
call printf
dec rax
mov [rbp-4], rax
jnz for
for_out:
add rsp, 4
pop rbp
ret
Forwarded from AlPlank (Al Pt)
https://t.me/XJBFW/5028
(Java里没有靠谱的清除屏幕的接口,只能执行clear/cls指令或靠回车物理清屏幕…)
(Java里没有靠谱的清除屏幕的接口,只能执行clear/cls指令或靠回车物理清屏幕…)
Telegram
XJB🍉FW
发一张生草图