网站设计思路文案范文,专业手机网站建设多少钱,如何将wordpress上传,专业做网站安全的sine安一、pthread_self函数
功能#xff1a;获取线程ID。
pthread_t pthread_self(void);
线程ID#xff1a;pthread_t类型#xff0c;本质#xff1a;在Linux为无符号整数(%lu)#xff0c;其他系统可能是结构体实现线程ID是进程内部识别标志。#xff08;两个进程间#…一、pthread_self函数
功能获取线程ID。
pthread_t pthread_self(void);
线程IDpthread_t类型本质在Linux为无符号整数(%lu)其他系统可能是结构体实现线程ID是进程内部识别标志。两个进程间线程ID允许相同
注意不应使用全局变量pthread_t tid在子线程通过pthread_create传出参数来获取线程ID而应使用pthread_self. 二、pthread_create函数
功能创建一个新线程 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);typedef void *(*start_routine) (void *);
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, start_routine th_fn, void *arg);
参数
pthread_t当前Linux可理解为typedef unsigned long int pthread_t参数1传出参数保存系统为我们分配好的线程ID参数2通常传NULL表示使用线程默认属性。若想使用具体属性也可以修改该参数。参数3函数指针指向线程主函数(线程体)该函数运行结束则线程结束。参数4线程执行期间所使用的参数。1. 测试代码
#includestdio.h
#includepthread.h
#includeunistd.h
#includestdlib.hvoid *thrd_func(void *arg)
{printf(In threadthread id %lu, pid %u\n, pthread_self(), getpid());return NULL;
}int main(void)
{pthread_t tid;int ret; printf(In main 1: thread id %lu, pid %u\n, pthread_self(), getpid());ret pthread_create(tid, NULL, thrd_func, NULL);if(ret ! 0) {fprintf(stderr, pthread_create error: %s\n, sterror(ret));exit(1);}sleep(1); printf(In main 2: thread id %lu, pid %u\n, pthread_self(), getpid()); return 0;
}输出结果 2. 测试代码
#includestdio.h
#includepthread.h
#includeunistd.h
#includestdlib.h
#includestring.hvoid *thrd_func(void *arg)
{int i (int) arg;sleep(i);printf(%dth thread: id %lu, pid %u\n, i1, pthread_self(), getpid());return NULL;
}int main(void)
{pthread_t tid;int ret, i; for(i 0; i 5; i) {ret pthread_create(tid, NULL, thrd_func, (void *)i);if(ret ! 0) {fprintf(stderr, pthread_create%s\n, strerror(ret));exit(1);}}sleep(i);return 0; //将当前进程退出
}
输出结果 三、线程与共享
注意线程间共享全局变量
【牢记】线程默认共享数据段、代码段等地址空间常用的是全局变量而进程间不共享变量只能借助mmap。
线程共享资源
文件描述符每种信号的处理方式当前工作目录用户ID和组ID内存地址空间.text/ .data/ .bss/heap/共享库
线程非共享资源
线程ID处理器现场和栈指针(内核栈errno变量信号屏蔽字
测试代码
#includestdio.h
#includepthread.h
#includestdlib.h
#includeunistd.hint var 100;void *tfn(void *arg)
{var 200;printf(thred\n);return NULL;
}int main(void)
{printf(At first var %d\n, var);pthread_t tid;pthread_create(tid, NULL, tfn, NULL);sleep(1);printf(after pthread_create, var %d\n, var);return 0;}
输出结果 四、pthread_exit函数
功能将单个线程退出
void pthread_exit(void *retval) 参数retval表示线程退出状态通常NULL1. 测试代码
#include pthread.h
#include stdio.h
#include unistd.h
#include stdlib.hint func(int a)
{pthread_exit(NULL);
}void *tfn(void *arg)
{int i;i (int)arg;sleep(i);if(i 2)func(888);printf(Iam %dth thread, Thread_ID %lu\n, i1, pthread_self());pthread_exit(NULL);
}int main()
{int n 5, i;pthread_t tid;for(i 0; i n; i) {pthread_create(tid, NULL, tfn, (void*)i);}sleep(i);printf(I am main and I am not a process, Iam a thread!\nmain_thread_ID %lu\n, pthread_self());return 0;
}
输出结果 2. 测试代码
#include pthread.h
#include stdio.h
#include unistd.h
#include stdlib.hint func(int a)
{return 0;
}void *tfn(void *arg)
{int i;i (int)arg;sleep(i);if(i 2)func(888);printf(Iam %dth thread, Thread_ID %lu\n, i1, pthread_self());pthread_exit(NULL);
}int main()
{int n 5, i;pthread_t tid;for(i 0; i n; i) {pthread_create(tid, NULL, tfn, (void*)i);}sleep(i);printf(I am main and I am not a process, Iam a thread!\nmain_thread_ID %lu\n, pthread_self());return 0;
} 输出结果 五、pthread_join函数
int pthread_join(pthread_t thread, void **retval);返回值若成功返回0否则返回错误编号
参数
thread线程ID(【注意】不是指针)retval存储线程结束状态
注意
调用该函数的线程将挂起等待直到id为thread的线程终止状态。thread线程以不同的方法终止通过pthread_join得到的终止状态是不同的总结如下
如果thread线程通过return返回retval所指向的单元存放的是thread线程函数的返回值。若果thread线程被别的线程调用pthread_cancel异常终止掉retval指向单元里存放的是常数PTHREAD_CANCELED。1. 测试代码
#includepthread.h
#includestdlib.htypedef struct
{int a;int b;
} exit_t; void *tfn(void *arg)
{exit_t *ret;ret (exit*)malloc(sizeof(exit_t));ret-a 100;ret-b 300;pthred_exit((void *) ret);
}
int main()
{pthread_t tid;exit_t *retval;pthread_create(tid, NULL, tfn, NULL);pthread_join(tid, (void**)retval); /*调用pthread_join可以获取线程的退出转态*/ printf(a %d, b %d\n, retval-a, retval-b);return 0;}
输出结果 2. 测试代码
#includestdio.h
#includestring.h
#includepthread.h
#includestdlib.h
#includeunistd.h
#includestring.htypedef struct {int ch;int var;char str[64];
}exit_t;void *thrd_func(void *arg)
{exit_t *retval (exit_t *)arg;retval-ch m;retval-var 200;strcpy(retval-str, my thread\n);pthread_exit((void*) retval);
}
int main()
{pthread_t tid;int ret;exit_t *retval (exit_t *)malloc(sizeof(exit_t));printf(In main 1: thread id %lu, pid %u\n, pthread_self(), getpid());ret pthread_create(tid, NULL, thrd_func, (void*)retval);if(ret ! 0) {fprintf(stderr, pthread_create error: %s\n, strerror(ret));exit(1);}pthread_join(tid, (void**)retval);printf(ch %c, var %d, str %s\n, retval-ch, retval-var, retval-str);free(retval);pthread_exit((void *)1);
}
输出结果 测试代码
#includestdio.h
#includestring.h
#includepthread.h
#includestdlib.h
#includestring.h
#includeunistd.htypedef struct {int ch;int var;char str[64];
}exit_t;void *thrd_func(void *arg)
{exit_t *retvar (exit_t *)malloc(sizeof(exit_t));retvar-ch m;retvar-var 200;strcpy(retvar-str, my thread\n);pthread_exit((void*) retvar);
}
int main()
{pthread_t tid;int ret;exit_t *retval;printf(In main 1: thread id %lu, pid %u\n, pthread_self(), getpid());ret pthread_create(tid, NULL, thrd_func, NULL);if(ret ! 0) {fprintf(stderr, pthread_create error: %s\n, strerror(ret));exit(1);}pthread_join(tid, (void**)retval);printf(ch %c, var %d, str %s\n, retval-ch, retval-var, retval-str);free(retval);pthread_exit((void *)1);
}
输出结果 3. 测试代码
#includestdio.h
#includestdlib.h
#includeunistd.h
#includepthread.hint var 100;void *tfn(void *arg)
{int i;i (int) arg;sleep(i);if(i 1) {var 333;printf(var %d\n, var);return (void*) var;} else if(i 3) {var 777;printf(Im %dth pthread, pthread_id %lu\n var %d\n, i1, pthread_self(), var);pthread_exit((void*)var); } else {printf(Im %dth pthread, pthread_id %lu\n var %d\n, i1, pthread_self(), var);pthread_exit((void*)var);}return NULL;
}int main()
{int i;pthread_t tid[5];int *ret[5];for(i 0; i 5; i) {pthread_create(tid[i], NULL, tfn, (void*)i);}for(i 0; i 5; i) {pthread_join(tid[i], (void**)ret[i]);printf(----------%ds ret %d\n, (int)ret[i]); }printf(Im main pthread tid %lu\t var %d\n, pthread_self(), var);sleep(i);return 0;
}
输出结果