关于线程问题.

nebula2005
关于线程问题.

请教各位,这样使用线程的全局变量是否有合理?是否有隐患???

主进程main 需要开启多个线程.但是需要开启多少个为不固定情况.

在main中定义一个线程的全局变量, pthread_t p_thid,然后封存一个数据结构.(链表,都有一个p_thid这样的成员)
typedef struct _a_
{

    char name[512];
    pthread_t p_thid;

}a;

每次接收到要新建线程信息时, 先malloc,保存到链表一份.
然后调用.pthread_create( &p_thid, NULL, test1, NULL);并把a.p_thid = p_thid;
这样多次调用创建线程的函数.pthread_create( &p_thid, NULL, test1, NULL); (多次使用同一个线程全局变量p_thid来创建线程.)
并把other.p_thid = p_thid;

也就是 添加, A, B, C, D,...多个链表节点,都保存了同一个线程变量 p_thid, 但是他们的线程id,不同.
这样在main进程中,遍历链表应该就可以根据name 找到开启的线程的所有id,  
我做过试验,每次创建的id,%d打印,都是非常大的负数(但是id的确都不相同)....不明白为什么会是这样. 例如: id -1219376240
想请问一下各位高手,我这样使用是否合理??
如果合理,那么想在请问一下,我想给每个后台运行的线程单独发信号,
比如:想在main,中能够单独给某一个后台运行的线程发送停止信号,而不影响到其它线程.如何入手??线程的设置属性中,没有提到关于信号的设置.

第二个问题是:
当后台运行这样的线程收到让自己停止的信号后,不能马上停止,(也就是main不能直接kill掉).需要后台线程自己处理完某些动作后,才自己退出,并释放自己的资源.

同时,像这种应用情况,线程应该使用非分离模式的吧?如果是分离的,那么main退出后其它后台线程如何得知??
没有头绪...寻求帮助.

tassard
1.想请问一下各位高手,我这样使用是否合理??
你创建和使用链表的方法是对的

2.想在main,中能够单独给某一个后台运行的线程发送停止信号,而不影响到其它线程.如何入手?
你是说信号机制?能不能用条件变量通知线程?线程得到通知后让它去检查一个全局变量来确定是否在通知自己?

3.同时,像这种应用情况,线程应该使用非分离模式的吧?如果是分离的,那么main退出后其它后台线程如何得知??
如果main退出所有线程都会结束,所以要使用汇合模式让main等待各个线程。

xxyqiufeng
[quote]原帖由 [i]tassard[/i] 于 2008-6-29 20:39 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8698232&ptid=1183824][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
2.想在main,中能够单独给某一个后台运行的线程发送停止信号,而不影响到其它线程.如何入手?
你是说信号机制?能不能用条件变量通 ... [/quote]
1、感觉没问题,但是如果那个线程结束了,在通过这个结构链表来访问会不会有问题呢?
2、不能直接用信号来实现吗?都用信号来实现,条件信号和互斥信号,互斥信号用来让main等待线程结束,这样应该可以吧?

lipingtababa
id,%d打印,都是非常大的负数(但是id的确都不相同)....不明白为什么会是这样. 例如: id -1219376240
------------------------pthread_t是一个结构体,而且其内部结构是不透明的,是由实现决定的。在某些系统上也许可以这样打印,在另外一些系统上不能,