如何让两个函数轮流执行自身的语句
#include <stdio.h>
//有如下两个函数
//先执行test1,执行到第一条语句"int i;"接着去执行
//test2第一条语句,又返回到test1执行第二条语句,
//依此类推。即是让两个函数轮流执行自身的语句。
//如何实现。谢谢!!
void test1(void){
int i;
for(i=0; i<32768; i++)
printf("i=%d\n",i);
}
void test2(void){
int j;
for(j=0; j<32768; j++)
printf("j=%d\n",j);
}
int main(int argc, char *argv[])
{
test1();
test2();
return 0;
}
[解决办法]
我也想知道...
[解决办法]
void test1(void){
int i;
for(i=0; i <32768; i++)
printf("i=%d\n",i);
test2();
}
void test2(void){
int j;
for(j=0; j <32768; j++)
printf("j=%d\n",j);
test1();
}
int main(int argc, char *argv[])
{
test1();
return 0;
}
[解决办法]
基本没有什么办法做到。在什么情况下需要这么奇怪的需求?如果真要交替,你还不如把两个函数合并在一起呢
[解决办法]
正如1楼所言,单线程无法实现。
另外想请教楼主,
楼主为什么会有这样的需求,
究竟是要满足什么问题?
达到什么效果?
[解决办法]
单线程其实可以用加强版的goto: setjmp和longjmp函数。
就像汇编里的ljmp一样跳来跳去
[解决办法]
楼主可以看一下多线程的资料
这涉及到线程间通信问题
线程间通信的两大关键:同步与互斥
你说的应该就是同步问题了
这个要看你用的是什么操作系统了
比如vxworks,我用的这个
有一个 同步信号量 可以简单的实现线程间的同步配合
但是一般来说
让2个线程轮流执行1条语句意义不大
而且,1条语句的概念太过于模糊
因为1条语句可能表示N条机器指令
[解决办法]
- C/C++ code
#include <stdio.h> #include <setjmp.h>//有如下两个函数 //先执行test1,执行到第一条语句"int i;"接着去执行 //test2第一条语句,又返回到test1执行第二条语句, //依此类推。即是让两个函数轮流执行自身的语句。 //如何实现。谢谢!! jmp_buf jmpbuf1, jmpbuf2;void test1(void){ int i; for(i=0; i <10; i++) { if (setjmp(jmpbuf1) == 0) { return; } else { printf("i=%d\n", i); longjmp(jmpbuf2, 1); } }} void test2(void){ int j; for(j=0; j <10; j++) { if (setjmp(jmpbuf2) == 0) { longjmp(jmpbuf1, 1); } else { printf("j=%d\n", j); } }} int main(int argc, char *argv[]) { test1(); test2(); return 0; }
[解决办法]
不要随便的说单线程无法做到这,无法做到那,在汇编层都有的sjmp和ljmp,在高级语言一样能够实现。虽然这是我们应该少用甚至不用的。
[解决办法]
[解决办法]
[解决办法]
在我看来,对于单核机器来说,在CPU层面所有的应用都是单线程的,只是操作系统帮助对我们的进程和线程进行调度。
[解决办法]
单核机器也有多线程的,例如硬盘操作可以不需要CPU一直参与,显卡绘图也是
------解决方案--------------------
重新组装成一个嘛
[解决办法]
支持9楼
[解决办法]
[解决办法]
开两个线程
[解决办法]
[解决办法]
楼主用判断 加goto 研究研究。
[解决办法]
操作系统管理着所有进程的相关数据。这里想象一个最简单的进程调度。假设只有A B两个进程,操作系统核心要调用A进程,则取一段A进程的指令,在后面插入返回核心的跳转指令,然后跳转去执行A进程,A进程执行完毕返回操作系统核心,又用相同的方法调用B进程的指令片。因为在很短的时间内每个进程的指令都有机会执行,所以用户感觉到是在同时进行,但从CPU的角度看,只有一系列指令在执行。普通进程不能执行操作系统核心指令,那是从CPU中控制的。比如从核心指令跳转到普通指令前,设置CPU中的一个标志位,使执行普通指令片时不能执行某些特殊的核心指令,比如去修改核心指令设置的返回位置。同时运用的一个比较重要的方法是,普通进程的所有内存访问都要通过物理内存到逻辑内存的映射,进程间内存访问是互不冲突的,普通进程也访问不到关键数据区。
在应用级别上去模拟操作系统的调度是很困难的,也没有太大的意义。其实我不懂操作系统,以上只是个人的理解。
[解决办法]
用纤程(Fiber),参考ConvertThreadToFiber、CreateFiber、SwitchToFiber函数。
[解决办法]
多线程的话,很方便的使用方式是使用intel 的openmp技术,是以宏的方式向你的代码里面需要用的地方添加,方便开关,很容易。
[解决办法]
帮顶!!!
[解决办法]
多线程 加锁
[解决办法]
没怎么明白LZ的意图。
不过从俺浅薄的知识来看,有如下方法可以做到:
linux下fork一把;
创建中断,自己处理2个函数的上下文切换问题;
...
[解决办法]
感觉像汇编语言中要使用的一样,难道楼主想直接操作CPU??
[解决办法]
delphi的processmessages 和 vb的doevents 是可以实现类似效果的,但不一样
比较接近的做法是在2个定时器里写,结构变化比较大,而且环境要求也不一样
[解决办法]
多线程不是你想得这样地,基本上OS已经封装完毕了,你只能用了,要不你自己写个简单的OS。
[解决办法]
必须用多线程。
[解决办法]
UP
[解决办法]
要是用C语言实现,那两个test1和test2是怎么做到的啊?
[解决办法]
这样的话我觉得应该用一个总的函数来调用test1和test2不能只是他们自身随便的调用会出现死循环的
[解决办法]
单线程可以做到吧
[解决办法]
单线程还真不能实现~~
[解决办法]
[解决办法]
[解决办法]
单线程是做不到的。多线程。
如果要按行交替执行同,必须有锁。
[解决办法]
见过 不过记不清了.
是利用windows标准流底层的特性实现的.
感觉是一个很无聊的问题
[解决办法]
同意10楼 用setjmp longjmp完全可以实现
[解决办法]
在symbian中有中活动对象机制,似乎可以模拟这种实现
[解决办法]
看完之后发现没几个人明白楼主想知道什么。
楼主应该是想知道操作系统的内核的任务调度原理。
实行某个任务到半挂起去实行其他任务,这是通过什么样的手段实现的?
缩微到两个函数,就是实行第一个函数到半转去实行第二个函数,轮到第一各函数时离开第二个函数转回实行第一个函数。
CPU通过什么机制来完成这样的功能?
概括地:操作系统调度任务的硬件机制是什么?
我估计没错,以上就是搂主的真实意图。
这也正是我想知道的。
希望来个真正的高手回答一下。让大家学习学习~~
[解决办法]
[解决办法]
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
用goto嵌套!!!!!!!!!
[解决办法]
这个问题其实我想了好久。
我作嵌入式开发的,移植操作系统对具体应用的局限性比较大,一直想开发出一个最适合自己用的操作系统。但是对系统任务切换的原理(不是软件层次的, 硬件资源相关)不甚了解。
我的想法是:
假设程序运行函数A到address_0处,需要跳转运行其他函数,则将此时的PC指针软件压入堆栈,将函数使用的所有局部变量压入堆栈;将使用到的硬件设备(如显示器)回退。当轮到函数A再次运行时,查询列表,将address_0的取出,赋值给PC,将A的局部变量还原,则函数A接着上次未完成的事业继续进行奋斗,并且A的相关局部变量不变。
另外,如果使用硬件,且硬件动作分步实行,如某设备动作需要先写指令后写数据,那么在跳转的时候必须将已经发送的指令废除,防止硬件错误。这就需要设备管理功能的函数。
[解决办法]
都是高手啊!
[解决办法]
- C/C++ code
//有如下两个函数 //先执行test1,执行到第一条语句"int i;"接着去执行 //test2第一条语句,又返回到test1执行第二条语句, //依此类推。即是让两个函数轮流执行自身的语句。 //如何实现。谢谢!!
[解决办法]
- C/C++ code
#include "stdafx.h"#include <windows.h>HANDLE g_handle1 = CreateEvent(NULL,false,true,"ev1");HANDLE g_handle2 = CreateEvent(NULL,false,false,"ev2");DWORD WINAPI test1(LPVOID lpParameter){ int i; for(i=0; i <10; i++) { WaitForSingleObject(g_handle1,INFINITE); printf("i=%d\n",i); SetEvent(g_handle2); Sleep(1); } SetEvent(g_handle1); return 0;}DWORD WINAPI test2(LPVOID lpParameter){ int j; for(j=0; j <10; j++) { WaitForSingleObject(g_handle2,INFINITE); printf("j=%d\n",j); SetEvent(g_handle1); Sleep(1); } SetEvent(g_handle2); return 0;}int main(int argc, char *argv[]){ HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,test1,NULL,0,NULL); hThread2 = CreateThread(NULL,0,test2,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); HANDLE harr[2]; harr[0] = g_handle1; harr[1] = g_handle2; WaitForMultipleObjects(2,harr,true,INFINITE); return 0;}
[解决办法]
学习
[解决办法]
10 楼代码很好玩! 有歪门邪气就一定要研究研究, 好做到暗箭伤人或不被按键伤人
[解决办法]
mark一下
[解决办法]
void test1(void){
int i;
for(i=0; i <32768; i++)
printf("i=%d\n",i);
}
void test2(void){
int j;
for(j=0; j <32768; j++)
printf("j=%d\n",j);
}
int main(int argc, char *argv[])
{
while(1)
{
test1();
test2();
}
return 0;
}
这样行吗?
[解决办法]
void test1(void){
int i;
test2();
for(i=0; i <32768; i++)
printf("i=%d\n",i);
}
void test2(void){
int j;
for(j=0; j <32768; j++)
printf("j=%d\n",j);
}
int main(int argc, char *argv[])
{
test1();
test2();
return 0;
}
上面的确实不行,但是,
这样不能满足你的要求吗?
[解决办法]
建议LZ看看操作系统原理
简单地讲就是保护线程上下文,转移执行流程
只利用语言本身的特性在用户程序级别应该是做不到的
[解决办法]
10 楼代码改成如下运行就有问题了,可见这个setjmp 保存环境是非常有限的。
#include <stdio.h>
#include <setjmp.h>
#include <conio.h>
//有如下两个函数
//先执行test1,执行到第一条语句"int i;"接着去执行
//test2第一条语句,又返回到test1执行第二条语句,
//依此类推。即是让两个函数轮流执行自身的语句。
//如何实现。谢谢!!
int aa=0x1234;
jmp_buf jmpbuf1, jmpbuf2;
int ab=0x5678;
void test1(void){
int i;
for(i=0; i <10; i++)
{
if (setjmp(jmpbuf1) == 0)
{
return;
}
else
{
printf("i=%d\n", i);
longjmp(jmpbuf2, 1);
}
}
}
void test2(void){
int j;
for(j=30; j <40; j++)
{
if (setjmp(jmpbuf2) == 0)
{
longjmp(jmpbuf1, 5);
}
else
{
printf("j=%d\n", j);
}
}
}
int main(int argc, char *argv[])
{
test1();
test2();
getchar();
return 0;
}
打印输出:
i=30
j=30
i=31
j=31
i=32
j=32
i=33
j=33
i=34
j=34
i=35
j=35
i=36
j=36
i=37
j=37
i=38
j=38
i=39
j=39
i 值没有打印0-9, 而是打印了30-39,可见是使用了j 变量, setjmp 无力恢复栈内容。
但可以实现pc 跳转,鉴定完毕!
[解决办法]
- C/C++ code
#include <stdio.h>#define N 32768int x;void test1(void){ static int i=0; for( ; i<N; i++) { printf("i=%d\n",i); if(i==x) return i++; }} void test2(void){ static int j=0; for( ; j<N; j++) { printf("j=%d\n",j); if(j==x) return j++; }} int main(void) { for(x=0; x<N; x++) { test1(); test2(); } return 0; }
[解决办法]
jmpbuf1, jmpbuf2从哪点传进去的呀?
[解决办法]
多线程的话,两句话之间运行了很多其他指令,来帮助你协调同步;
jmpbuf1, jmpbuf2,单线程,用保存pc和上下文环境,“投机”同步语句的执行顺序。
这个问题,看透了就那么回事!汇编是按照既定顺序运行,C语言层面可以绕着法让你“看起来”是两句交替执行。
[解决办法]
[解决办法]
学习中
[解决办法]
回帖是一种美德!每天回帖即可获得 10 分可用分!
[解决办法]
赞同此观点!呵呵!
[解决办法]
lz的想法很有意思,不过lz的问题确是个没有意义的问题。
就算使用线程调度的方法实现了lz的要求,其运行结果与单线程环境下直接执行的结果应该是一样的,唯一的区别就在于实现了线程调度以后,需要花大量的cpu时间来切换线程上下文,
[解决办法]
agree with this point!
[解决办法]
呵呵
楼主这种想法值得表扬——有创意勤思考
不过你把多线程与你的题目联系起来我觉得这是两个方面的问题
[解决办法]
好高深的问题
偷偷凑个热闹
[解决办法]
为啥不合并两函数.
[解决办法]
楼主是想知道任务切换最原始原理。开发自己的操作系统
[解决办法]
条件控制了
[解决办法]
[解决办法]
[解决办法]
[解决办法]
return i++;
是为了退出函数用的
[解决办法]
谢谢53楼
[解决办法]
操作系统实现多线程一般基于时间片的,也就是线程轮流执行一小段时间(几十毫秒或几毫秒),让使用者看起来是多个线程一起跑.具体就是一个线程执行一段时间,产生一个中断,保护当前线程状态,恢复下一个就绪线程状态,跳转到该线程,这样子的循环.如果像楼主那样执行一条语句就跳,严重影响效率.
[解决办法]
支持9楼
[解决办法]
不错了,学习了,应该设计出一个线程内切片的框架出来。
[解决办法]
nlylidb 说的好。
[解决办法]
[解决办法]
nlylidb 程序好。
[解决办法]
很无聊!
你是想做操作系统吗?
如果你真的想干的话,就不能用真正的函数
而是得自造假函数,和宏
[解决办法]
[解决办法]
这个贴,从“我回复的贴子”页面,居然进不来了。
[解决办法]
使用2个线程分别调用两个函数是C语言级实现该功能的最理想方法
如果不用这个办法的话,就需要与具体的硬件打交道
也就是要使用汇编
只要理解一些操作系统的实现方法的原理,就会明白:
C语言是为了写操作系统而发明的
但是仅仅用C语言是无法开发操作系统的
linux操作系统的实现中,对于不同类别硬件的操作,有着不同的C的内联汇编代码
(这其中包括不同种类的CPU,如i386架构的CRSC指令集的CPU、RISC指令集的MIPS、SPARC架构的CPU、还有M68K、alpha等等……这些都有不同的汇编代码
这些不同的汇编代码使用的寄存器、语言风格都不相同)
这些内联汇编代码被封装成了C函数,可以当做接口使用
操作系统就是通过这些接口来开发的,使用接口进行编写的代码部分在移植时重复使用
[解决办法]
没什么太大意义.
[解决办法]
开两个线程吧,然后每一句之前都调用等待函数如何?
像这样
建立多个event,自动重置
void workThread1(void *)
{
waitforsingleobject()
语句1_1;
waitforsingleobject()
语句1_2;
waitforsingleobject()
语句1_3;
...
}
void workThread2(void *)
{
waitforsingleobject()
语句2_1;
waitforsingleobject()
语句2_2;
waitforsingleobject()
语句2_3;
...
}
每个语句的最后调用setevent().
[解决办法]
学习,路过
[解决办法]
x学习;了
[解决办法]
就用C语言实现功能来说,10楼的代码是正确的;
但是操作系统实现多个程序并发执行,是通过进程和线程来做的,每个正在执行的代码序列都是一个进程或线程,操作系统依赖硬件特性实现进程或线程的调度和切换.
[解决办法]
单线程是不可能实现的。
使用两个线程,然后用同步互斥来解决!
[解决办法]
mark 学习