我正在考虑在我的应用程序中使用C++ 0x线程而不是Boost线程.但是,我不确定如何重新实现我对标准C++ 0x线程的重新实现,因为它们似乎没有interrupt()方法.
我目前的设置是:
工人wait()至少要求两个不同的条件变量.师父有一个"超时"状态:在这种情况下,它告诉所有工人停下来并给出他们当时获得的任何结果.使用Boost线程master只是interrupt_all()在线程组上使用,这导致worker停止等待.如果他们现在没有等待,主人还会设置一个bool工人定期检查的标志.
但是,在C++ 0x中,std::thread我没有看到任何替代品interrupt().我错过了什么吗?如果没有,我如何实施上述计划,以便工人不能永远睡觉?
我一直在尝试在程序集(16位)中为MS-DOS编写TSR(Terminate-Stay-Resident)程序(一般).我已经阅读了TSR上的维基百科页面以及在DOS中专门使用它的页面(但它似乎是用C语言教学,而不是直接用汇编语言).我查看了一个包含大量DOS中断文档的站点,找到了这个,这个,以及另一个与TSR程序最相关的站点.我无法发布所有链接,因为作为新用户,我在帖子上最多可以有2个超链接.
所以,我尝试在NASM中以实模式平面模型(.COM文件格式)编写(看似)非常简单的TSR程序.这是代码:
[BITS 16]
[ORG 0x0100]
[SECTION .text]
Start:
; Get current interrupt handler for INT 21h
mov AX,3521h ; DOS function 35h GET INTERRUPT VECTOR for interrupt 21h
int 21h ; Call DOS (Current interrupt handler returned in ES:BX)
mov WORD [v21HandlerSegment],ES ; Store the current INT 21h handler segment
mov WORD [v21HandlerOffset],BX ; Store the current INT 21h handler offset
; Write new interrupt handler for INT 21h
mov AX,2521h ; DOS function 25h …Run Code Online (Sandbox Code Playgroud) 在/ proc/interrupts中,我可以看到一些中断号属于IO-APIC-fasteoi,有些属于IO-APIC-edge.
两种类型的中断控制器有什么区别?
您是否知道在InputStream不关闭相关套接字的情况下中断Java读取的方法?
以下是抓取套接字输入流并转换为可中断DataInputStream的当前构造策略:
InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream()));
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream);
Run Code Online (Sandbox Code Playgroud)
这使用了一个ReadableByteChannel提供read(ByteBuffer)支持ClosedByInterruptExceptionthrowable的方法.
问题是,调用线程使一个中断read()的电话DataInputStream的原因底层套接字被关闭.
对于我的上下文,我需要套接字保持打开状态; 该read调用正在等待未来的用户输入,因此我正在使用中断将控制权传递回更高的组件,然后最终read再次返回.
如果有人能够建议使用JDK内置类来实现这一目标,或者可能指出某些信息无法实现,我将非常感激.
我知道还有其他方法可以达到同样的效果,但我很想知道这种方法是否可行.
我的信息来自这里.该作业要求读取不超过20个字符的程序,将这些字符转换为大写,然后将输入打印为大写字母.
我不知道如何从int21/AH = 0ah访问输入.除非我理解上面链接的内容,否则我真的不能问更准确的问题.谁能解释一下?此外,如果这有任何区别,我正在使用TASM.另外,我正在对freedos进行测试.
UPDATE1:
好的,多亏了你的帮助,我相信我理解中断是如何设置和行为的.
设置: 我必须指定一个ds:dx,我希望这个缓冲区存在
我必须将ds:dx设置为20(设置缓冲区可以容纳的最大字符数)
我必须将ds:dx + 1设置为0(我想以某种方式设置要读入的最小字符数)
实际上调用int21/AH = 0ah,它将转到ds:dx并解释预设的字节.它会在等待输入时暂停程序
int21/AH = 0ah将从我的输入填充ds:dx + 2 + n(其中n是输入的字符数,包括'\ r')
我现在的问题是,我该怎么做.我刚刚再次查看了x86汇编语言参考,但还没有找到任何有用的东西.
代码我到目前为止
assume cs:code,ds:code
code segment
start:
mov ax,code ;moves code segment into reg AX
mov ds,ax ;makes ds point to code segment
mov ah,0ah
int 21h
mov ax,1234h ;breakpoint
mov ah,9
mov dx,offset message
int 21h
endNow:
;;;;;;;;;;ends program;;;;;;;;;;
mov ah,0 ;terminate program
int 21h ;program ends
message db 'Hello world!!!',13,10,'$'
code ends
end …Run Code Online (Sandbox Code Playgroud) Thread.interrupt中断这样的调用sleep,join和wait.我想知道它是如何实现的.
我知道Thread.interrupt设置一面旗帜isInterrupted.是否wait只是调查这个标志?我希望它没有.所以我的问题是如何wait"了解"中断.
"RES:Rescheduling interrupts"和"LOC:Local timer interrupts"有什么区别?什么责任解雇RES中断?LOC是否与处理器中的定时器h/w生成的通用定时器中断相同?
另外,请详细说明在定时器中断和RES中断期间调度器的哪个部分被调用?如何在Linux内核中发生?
提前致谢.
我是ARM架构的新手,我正试图围绕唤醒机制.
首先,我发现很难找到关于此的好消息.ARM的文档似乎非常简洁.
我想要了解的是,当Cortex(尤其是我正在使用的M0)将被唤醒时.
作为参考,我还咨询了以下内容:
WFE指令的文档是:
3.7.11. WFE
Wait For Event.
Syntax
WFE
Operation
If the event register is 0, WFE suspends execution until
one of the following events occurs:
an exception, unless masked by the exception mask registers or the current
priority level
an exception enters the Pending state, if SEVONPEND in the
System Control Register is set
a Debug Entry request, if debug is enabled
an event signaled by a peripheral or another processor in a
multiprocessor …Run Code Online (Sandbox Code Playgroud) 在操作系统中,系统调用和中断之间有什么区别?所有系统调用都是中断吗?所有中断都是系统调用吗?
我有一个用于UART的缓冲区,它以这种方式声明:
union Eusart_Buff {
uint8_t b8[16];
uint16_t b9[16];
};
struct Eusart_Msg {
uint8_t msg_posn;
uint8_t msg_len;
union Eusart_Buff buff;
};
struct Eusart {
struct Eusart_Msg tx;
struct Eusart_Msg rx;
};
extern volatile struct Eusart eusart;
Run Code Online (Sandbox Code Playgroud)
这里是填充缓冲区的函数(将使用中断发送):
void eusart_msg_transmit (uint8_t n, void *msg)
{
if (!n)
return;
/*
* The end of the previous transmission will reset
* eusart.tx.msg_len (i.e. ISR is off)
*/
while (eusart.tx.msg_len)
;
if (data_9b) {
memcpy((void *)eusart.tx.buff.b9, msg,
sizeof(eusart.tx.buff.b9[0]) * n);
} else {
memcpy((void *)eusart.tx.buff.b8, …Run Code Online (Sandbox Code Playgroud)