如何让两个函数轮流执行自身的语句
#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条机器指令
[解决办法]
#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,在高级语言一样能够实现。虽然这是我们应该少用甚至不用的。
[解决办法]
是利用windows标准流底层的特性实现的.
感觉是一个很无聊的问题
[解决办法]
同意10楼 用setjmp longjmp完全可以实现
[解决办法]
在symbian中有中活动对象机制,似乎可以模拟这种实现
[解决办法]
看完之后发现没几个人明白楼主想知道什么。
楼主应该是想知道操作系统的内核的任务调度原理。
实行某个任务到半挂起去实行其他任务,这是通过什么样的手段实现的?
缩微到两个函数,就是实行第一个函数到半转去实行第二个函数,轮到第一各函数时离开第二个函数转回实行第一个函数。
CPU通过什么机制来完成这样的功能?
概括地:操作系统调度任务的硬件机制是什么?
我估计没错,以上就是搂主的真实意图。
这也正是我想知道的。
希望来个真正的高手回答一下。让大家学习学习~~
[解决办法]
//有如下两个函数 //先执行test1,执行到第一条语句"int i;"接着去执行 //test2第一条语句,又返回到test1执行第二条语句, //依此类推。即是让两个函数轮流执行自身的语句。 //如何实现。谢谢!!
[解决办法]
#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 跳转,鉴定完毕!
[解决办法]
#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!
[解决办法]
呵呵
楼主这种想法值得表扬——有创意勤思考
不过你把多线程与你的题目联系起来我觉得这是两个方面的问题
[解决办法]
好高深的问题
偷偷凑个热闹
[解决办法]
为啥不合并两函数.
[解决办法]
楼主是想知道任务切换最原始原理。开发自己的操作系统
[解决办法]
条件控制了
[解决办法]
[解决办法]
nlylidb 说的好。
[解决办法]