找回密码
 注册
查看: 2579|回复: 16

请教多线程问题!

[复制链接]
发表于 2006-9-29 15:52:37 | 显示全部楼层 |阅读模式
我的程序里创建了两个线程,一个线程用来每100ms读串口,里面包含一个select函数

(它的阻塞时间是0秒);一个线程用每100ms写串口.程序开始运行之后一开始还好,可

是运行一段时间以后,就只有第二个线程在运行,第一个线程不知道为什么就停了.

请问大家这是怎么回事呀?
发表于 2006-9-29 15:54:21 | 显示全部楼层
停住?阻塞还是退出?
回复

使用道具 举报

 楼主| 发表于 2006-9-29 15:58:14 | 显示全部楼层
不知道

我在程序里要它每次读串口的时候就输出一句话"welcome to pthread one",每次写

串口的时候输出"welcome to pthread  two",后来就只输出第二句了!

而且我的阻塞时间是0啊,这个怎么看是退出还是阻塞呢?
回复

使用道具 举报

发表于 2006-9-29 16:10:12 | 显示全部楼层
用printf调试
回复

使用道具 举报

 楼主| 发表于 2006-9-29 16:23:00 | 显示全部楼层
如果在select函数前面应该输出的东西没有输出应该是退出了吧?

那第一个线程是退出了!如果是阻塞的话整个系统就完全没有执行才对,但是我的第二个线程还在

运行!
回复

使用道具 举报

 楼主| 发表于 2006-9-29 16:27:43 | 显示全部楼层
[code:1]
int main(int argc,char *argv[])
{
char start;
gtk_init(&argc,&argv);

serial_set();

printf("please input S to start!\n");
scanf("%c",&start);

if(start=='S')
{
   pthread_create(&pt_R,NULL,(void *)&pt_Read,NULL);  //此处调用一个定时器函              

数用来读串口
   pthread_create(&pt_S,NULL,(void *)&pt_Send,NULL);  //此处调用一个定时器函数来

写串口
}
else
{
  printf("You can't start this program\n");
  return FALSE;
}

window=create_window();
gtk_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
gtk_widget_show_all(window);

gtk_main();

pthread_join(pt_R,&status);
pthread_join(pt_S,&status);

gtk_timeout_remove(timer_read);
gtk_timeout_remove(timer_send);

printf("goodbye!\n");
return FALSE;
}

[/code:1]
回复

使用道具 举报

发表于 2006-9-29 16:44:48 | 显示全部楼层
你都用gtk定时器了,还用线程干什么?
回复

使用道具 举报

发表于 2006-9-29 17:47:04 | 显示全部楼层
你未有示出关键线程的代码,估计问题在线程代码中。


同时,在此呼吁何时使用多线程的准则:
1. 对多线程的机制一知半解时,建议寻找其它方法,避免采用多线程。
2. 应用多线程前请充分了解各个调用的函数是否为线程安全?
3. 应用多线程前请充分了解调用的函数何时产生阻塞及如何避免 condition race?
4. 不要仅仅为了贪图方便而盲目使用多线程。
5. 充分了解多线程在相应平台的各种限制。
6. 各个线程间通讯严格注意是否发生异步访问冲突等等的情况,必要时流出足够的时间段给其它的。
7. 充分了解引入多线程后对系统相应一些开销的影响。
8. 多线程程序付诸实行时应经过足够且严格的测试。
回复

使用道具 举报

发表于 2006-9-29 22:56:44 | 显示全部楼层
同意楼上。
你的线程没有给出来!
回复

使用道具 举报

 楼主| 发表于 2006-9-30 09:45:05 | 显示全部楼层
我的线程程序为:
[code:1]
void *pt_Read(void *arg)
{
timer_read=gtk_timeout_add(100,(GtkFunction)Dispatch,NULL);

return;
}


void *pt_Send(void *arg)
{
timer_send=gtk_timeout_add(100,(GtkFunction)Pack,NULL);

return;
}

[/code:1]

都是用定时器函数去调用特定的函数.

版主问为什么用了定时器了还用线程干什么.我曾针对这个问题取消掉了线程而用

定时器去完成,根本不能显示数据,我只好用了线程.
回复

使用道具 举报

发表于 2006-9-30 12:31:54 | 显示全部楼层
gtk_timeout_add不是那样用的,居然不断地调用gtk_timeout_add,就跟你不断使用open却不用close一样,最后资源会让你消耗光的。

下面是gtk_timeout_add的例子,tofunc一定要return TRUE,否则定时器就会停掉。
[code:1]
#include <gtk/gtk.h>

gboolean tofunc(gpointer data)
{
        printf("hello\n");
        return TRUE;
}

main()
{
        guint hTo;
        gtk_init(NULL,NULL);
        hTo = gtk_timeout_add(1000,tofunc,NULL);
        gtk_main();
        gtk_timeout_remove(hTo);
}
[/code:1]
回复

使用道具 举报

发表于 2006-9-30 12:33:23 | 显示全部楼层
你这个程序没必要使用线程
回复

使用道具 举报

 楼主| 发表于 2006-10-3 09:28:59 | 显示全部楼层
为什么没有必要使用线程阿?请指教。
回复

使用道具 举报

发表于 2006-10-3 12:35:31 | 显示全部楼层
因为定时器已经能满足你的要求
回复

使用道具 举报

 楼主| 发表于 2006-10-8 09:32:03 | 显示全部楼层
但是不用线程,我的数据在我的界面上不能显示,我用了一下线程可以显示出数据我才用的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-6 15:39 , Processed in 0.025041 second(s), 15 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表