c语言中如何实现几个函数的并发执行,小弟很急呀

killer0428 2003-09-19 09:21:19
我再做一个有关C语言的编程,其中需要用到几个计时器,他和主程序之间的关系是并发执行,我不知道是用什么方法实现,但听说用中断或是信号量能实现。

我不知道该怎么做,请C语言的高手给我点指导,谢谢!

我的邮箱是killer0428@sina.com
...全文
631 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
killer0428 2003-10-08
  • 打赏
  • 举报
回复
多谢各位给我的建议,顺便问一下,有谁用过opnet
mtpmtp 2003-10-07
  • 打赏
  • 举报
回复
"当执行倒计时器函数的时候"
不知道你的主程序是不是可以定时执行“计时器”函数,如果可以,你可以自己写定时器的创建,终止,及定时器结点的管理函数。最简单的实现原理:
各定时器结点的数据结构中至少包括:该定时器结点的标识号(ID),该定时器结点的长度(或可以称为计数器Counter),该定时器结点超时后要处理的函数信息(如:相关函数的指针)。
建议你用链表管理这些定时器结点,创建一个定时器,就把该结点放到忙链中,终止或定时器超时,就将该结点再放回到空闲链中。
主函数每次定时对忙链表中的定时器结点处理,将其Counter--(这是比较简单的一种处理方式),当Counter变为零,说明定时器超时,你可以用该结点保存的相关信息执行你需要的操作,然后将该结点从忙链取出,加到空闲链中。
yjf7888 2003-09-24
  • 打赏
  • 举报
回复
void *thre_route(int *piDelay)最后少了一句return NULL;
yjf7888 2003-09-24
  • 打赏
  • 举报
回复
简要提一下(使用unix下posix线程):
int g_iTimer = 0;//计数器

void *thre_route(int *piDelay);

int main()
{
thread_t thre_id;
int iDelayTime;
iDelayTime = 3;
pthread_create(&thre_id, thre_route, &iDelayTime);//启动线程
...
//以下代码可以检查g_iTimer的值
}

void *thre_route(int *piDelay)
{
int idelay = *piDelay;
while(1)
{
//用sleep或select实现指定时长的睡眠后把g_iTimer加一, 如
sleep(idelay);//用select代替sleep可以实现更精确的计时。
g_iTimer++;
}
}
手边没有资料,代码里函数和类型都是凭印象写的,可能有误。除了用线程,也可以用信号SIG_ALRM(大概是这样写的),多计时器需要自己写计时器链表。注意我说的是信号,不是信号量。

在windows环境下就简单多了,需要时再说。
同楼上,也可以用轮询的办法,精度可能低一些。
wkoji 2003-09-23
  • 打赏
  • 举报
回复
tc好象不支持多线程的
wengzhong 2003-09-23
  • 打赏
  • 举报
回复
不应该说C不支持线程
是DOS下的编程不支持线程
和操作系统有关
不用多线程也行的,轮换执行,在一个循环里,轮流执行就可以了.
不过计算时间不够精确,依赖住程序的运行速度.
也可以在主程序里每隔几个语句就加一个记时器.
for(;;)
{
time();
main();
}
killer0428 2003-09-23
  • 打赏
  • 举报
回复
当然,不用线程,只要能实现就行了。
killer0428 2003-09-23
  • 打赏
  • 举报
回复
具体功能是这样的:主程序在执行,当执行倒计时器函数的时候,计时器开始计时,每隔几秒钟将一个全局变量加一(注意:有几个计时器在执行)。当主程序执行到某个地方时,他要看现在的计时器记到几了,再执行下一步的程序。所以计时器函数和主程序之间的关系是并发执行,计时器就相当于在后台执行。所以我想到了用线程实现,但C里面不支持线程,不知道怎么实现。
yjf7888 2003-09-22
  • 打赏
  • 举报
回复
建议把帖子转到linux/unix版去,还有把你希望实现的具体功能说清楚.
killer0428 2003-09-22
  • 打赏
  • 举报
回复
yjf7888():

你能举出一个用信号量实现并发的例子吗?

希望你能给出一些源代码让我看看,谢谢!
yjf7888 2003-09-19
  • 打赏
  • 举报
回复
多线程+信号(UNIX)或
多线程+消息(win32)或者直接用系统提供的Timer
bluewinwind 2003-09-19
  • 打赏
  • 举报
回复
高手请把这个问题的答案也发给我吧,谢了
jackc524@hotmail.com

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧