标题: [求助]pthread.h库问题
aababy
新生入学
Rank: 1
注册用户



UID 188794
精华 0
积分 0(积分有什么用?)
帖子 12
阅读权限 10
注册 2007-4-12
状态 离线
发表于 2007-8-19 15:43  资料  个人空间  短消息  加为好友 
[求助]pthread.h库问题

编写了一个多线程程序:+PtgRjY1J:R
#include <unistd.h>|m{({F#]4zB/X
#include <stdio.h>
ypP:iw        su9BoG#include <pthread.h>
gF+XK6{7w/sqLinux伊甸园论坛
~}
`C4xj*V'o.?
pthread_key_t key;www.linuxeden.comf        N a(N;j6@\*`$Gr

$K } R(MC,gLinux伊甸园论坛void echomsg(int t)www.linuxeden.comhQ-T Kvu!@5f
{Linux伊甸园论坛_/k9]%N1E;n-r
        printf("线程退出.\n");
G
TlfS(o7_.z9Rwww.linuxeden.com
        printf("destructor excuted in thread %d, param=%d\n",pthread_self(),t);_$fy9jk!Z;EB*fQF
}Linux伊甸园论坛b@8D+f$Mft@


oG:TV2Exk)S"__
void *child1(void *arg)        //为每一个线程单独建一个执行函数
4g2}6~%R MHS%axWI{Linux伊甸园论坛i3K1{,z(rq`'i9P!c
        int tid=pthread_self();        //求线程id号
zK1f&R:\1h\&h(ARLinux伊甸园论坛        printf("thread %d enter\n",tid);
!^dy*x        |&a Tj        pthread_setspecific(key,(void *)tid);        //将tid的值与key相关联,注意不是*tid
!@5\,\dAp@8LU        sleep(2);www.linuxeden.com*A/p7q,|d3J+h
        printf("thread %d returns %d \n", tid , pthread_getspecific(key));        //读出key值,即*tid?
w#uP6KzPND0]www.linuxeden.com        sleep(5);
E
j fb
vn3Rm |5a"F$nwww.linuxeden.com
        F2@ m:k#`0O
        return NULL;
!Ej@phx'g6@       
C(XS$KvM \3Pl}Linux伊甸园论坛X4v.KX:?-W#[
U7F2{)U
Y

$o E`J$ST1p(G9Nu*K.t
void *child2(void *arg)Linux伊甸园论坛2}5{d+C5p Q
{www.linuxeden.com#?Q&Ww
IY

        int tid=pthread_self();www.linuxeden.com V8bkN$yYUlbm
        printf("thread %d enter\n",tid);Linux伊甸园论坛5O*u0jR
S)\T        M

        pthread_setspecific(key,(void *)tid);        //将tid的值与key相关联,注意不是*tidO T E*M:hh:VTy+l
R$}

        sleep(1);
/MT,BJO,\0Z6JE Hz        printf("thread %d returns %d \n", tid , pthread_getspecific(key));        //读出key值,即*tid?
R2P6L'FX7c-~Linux伊甸园论坛        sleep(5);
gj^gn4?d4u        b f;{ l.sE+[S1P)^4X
        return NULL;www.linuxeden.com
`A"iA"gOs

}www.linuxeden.com V9t:mp5PC"h

!Sa
u)W)O!ky_
&]h&a;_Y_'Pbp.h
int main()5^\A        X%Vz!gB9W
{4DB&mc|
        int tid1,tid2;        //线程号
Wyt`b?P3x        printf("hello\n");
t&G1o        @        pthread_key_create(&key,echomsg);        //注意在创建线程前创建私有数据,线程退出时会将key作为参数送入echomsgz2|B|1pw)oc
        pthread_create(&tid1,NULL,child1,NULL);        //创建线程,其中第一个NULL是设置线程属性,第二个NULL是child1函数的传人参数.线程的作用就是执行child1.        W@t4QgkxP
        pthread_create(&tid2,NULL,child2,NULL);
_&ht4Bq$Sxu        sleep(10);
%Eey0t(f        pthread_key_delete(key);        //释放TSD
.j2k ok9PEy-g        printf("main thread exit\n");
2kh{2T        N       
5o)vw;H3\5ICV5^*K        return 0;/p6u/mbco/z6M
}1iZ&eD
T:E

3x%Gi
@Xq

编译时总提示www.linuxeden.com3} v[5k        xSkHY5c
/tmp/ccFXz8Ip.o(.text+0xde): In function `child2':9}/mUfy)R
mythread.c: undefined reference to `pthread_setspecific'? pVLl&S,T
/tmp/ccFXz8Ip.o(.text+0xfc):mythread.c: undefined reference to `pthread_getspecific'j9M0r ?D\ O
/tmp/ccFXz8Ip.o(.text+0x166): In function `main':,d6|ee6?}:y3N
mythread.c: undefined reference to `pthread_key_create'www.linuxeden.comP/H\'?'f"E%U/F:[
/tmp/ccFXz8Ip.o(.text+0x17b):mythread.c: undefined reference to `pthread_create'        T N|%H^%Z1C^(R
/tmp/ccFXz8Ip.o(.text+0x190):mythread.c: undefined reference to `pthread_create'
Ws7Kp_0X]

/tmp/ccFXz8Ip.o(.text+0x1ae):mythread.c: undefined reference to `pthread_key_delete' i ta)w.hZ

K$n;]GZ(}2{y)XLinux伊甸园论坛另外用gcc -Ipthread -Wall mythread.c -o mythread也没有用;www.linuxeden.comk
e2B!@4n#r_PF3|


;{8~'\ ic'X.Y谢谢大家.

顶部
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 61(积分有什么用?)
帖子 4814
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-8-19 17:18  资料  个人空间  短消息  加为好友 
gcc file.c -lpthread ... ?





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
aababy
新生入学
Rank: 1
注册用户



UID 188794
精华 0
积分 0(积分有什么用?)
帖子 12
阅读权限 10
注册 2007-4-12
状态 离线
发表于 2007-8-20 14:40  资料  个人空间  短消息  加为好友 
谢谢dearvoid,用你提供的命令能通过.
-q/I,{.iS
\}UHR,IQ&twww.linuxeden.com还有点小问题:p leV%TJ NN
编译仍然有警告:
G3[6\-FU3t*i.Bmythread.c:43: 警告:passing argument 2 of ‘pthread_key_create’ from incompatible pointer type9zA0j&m        n5Sg1s
mythread.c:44: 警告:passing argument 1 of ‘pthread_create’ from incompatible pointer type
{qm!j*gOmythread.c:45: 警告:passing argument 1 of ‘pthread_create’ from incompatible pointer typewww.linuxeden.com|
B$xYP,A(^


Je6lt&L }www.linuxeden.com还有就是我在头文件中包含了<pthread.h>
] pNC;R*Bwww.linuxeden.com为什么还要在编译时加载进来呢?www.linuxeden.comA_        V@*E
Linux伊甸园论坛z|5Er~(d)_#{?U
-lpthread 为什么要加在file.c后面.www.linuxeden.com ad2B;W%?W7@f ai_%k
[)^~v7@
c!NC3E6Ly
[ 本帖最后由 aababy 于 2007-8-20 14:53 编辑 ]

顶部
不容错过的IBM 集群技术资源汇总
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 61(积分有什么用?)
帖子 4814
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-8-20 15:34  资料  个人空间  短消息  加为好友 
  • 关于编译时的警告, 请参阅相关函数的 manual, 查看其 prototype
    -@D,X?.XS
  • -lpthread 加在 file.c 前面应该也可以的, 不过作为`惯例', 一般把 compile time 的 option 往前放, link time 的 option 往后放
Linux伊甸园论坛&{Z;o#|;j:Guv
#]$O?Umz
s"s

[ 本帖最后由 dearvoid 于 2007-8-20 15:35 编辑 ]





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
不容错过的IBM 集群技术资源汇总
aababy
新生入学
Rank: 1
注册用户



UID 188794
精华 0
积分 0(积分有什么用?)
帖子 12
阅读权限 10
注册 2007-4-12
状态 离线
发表于 2007-9-4 15:54  资料  个人空间  短消息  加为好友 
回复 #4 dearvoid 的帖子

谢谢                                                 .

顶部
 



当前时区 GMT+8, 现在时间是 2008-5-17 04:15

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.093799 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP