标签:
1.线程的创建
int ret = pthread_create(&thdid,NULL,th_func,void *p);
th_func 执行程序任务 创建成功返回 0
thid --->pthread_t 是线程号,在这里做传出参数。
p 是th_func 的参数,使用时需要强制转换为void *
void* thread(void* p) { //线程的开始 int i=(int)p;//强制转换为整型 printf("I am child thread %d\n",i); while(1); }//线程结束 int main() { pthread_t th_id; int ret=pthread_create(&th_id,NULL,thread,(void*)5);//创建线程,将数值放入指针内 if(ret!=0) { printf("pthread_create failed ret=%d\n",ret); return -1; } while(1); return 0; }
2.线程等待
void* p1;
int ret = pthread_join( th_id, &p1 );//int pthread_join(pthread_t,void **p);
这里void *p1是上面所用的线程在退出时用pthread_exit时的参数,在这里也做传出参数使用。thid自然就是其等待的线程id
ex:
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> //创建线程,通过pthread_join拿到我们的线程的返回值 //线程函数 void* thread(void* p) { //线程的开始 strcpy((char*)p,"hello"); printf("I am child thread\n"); printf("child p is %p\n",p); pthread_exit(p);//通过pthread_exit实现线程退出,没有返回值,就写pthread_exit(NULL); }//线程结束 int main() { pthread_t th_id; void* p=malloc(20); printf("p is %p\n",p); int ret=pthread_create(&th_id,NULL,thread,p);//创建线程,将数值放入指针内 if(ret!=0) { printf("pthread_create failed ret=%d\n",ret); return -1; } void* p1; ret=pthread_join(th_id,&p1); if(ret!=0) { printf("pthread_join failed ret=%d\n",ret); return -1; } printf("main thread %s\n",(char*)p); printf("main thread p1=%p\n",p1); return 0; }
3.线程退出
pthread_exit(void *);一般在子线程结束需要传出参数时使用;
void* thread(void* p) { //线程的开始 strcpy((char*)p,"hello"); printf("I am child thread\n"); printf("child p is %p\n",p); pthread_exit((void*)0);//通过pthread_exit实现线程退出,没有返回值,就写pthread_exit(NULL); }//线程结束
4.线程申请内存问题
子线程申请内存后,当子线程推出后,其他线程仍然可以使用内存。
标签:
原文地址:http://www.cnblogs.com/STARK-INDUSTRIES/p/5656914.html