线程
-
线程:
-
创建线程:
相关头文件:
#include<pthread.h>
函数:
int pthread_create(pthread_t* tidp,const pathread_attr_t *attr,void *(*start_rtn)(void),void *arg)
tidp:线程id
attr:线程属性(通常为空)
start_rtn: 线程要执行的函数
arg:start_rtn的参数
ps:×××因为pthread的库不是linux系统的库,所以在进行编译的时候要加上-lpthread参数
#gcc filename -lpthread
实例1:thread_create.c
#include<stdio.h> #include<pthread.h> void *myThread1(void) { int i; for(i=0; i<100; i++) { printf("This is the 1st pthread,created by zieckey.\n"); sleep(1); } } void *myThread2(void) { int i; for(i=0; i<100; i++) { printf("This is the 2st pthread,created by zieckey.\n"); sleep(1); } } int main() { int i=0,ret=0; pthread_t id1,id2; / ret = pthread_create(&id1, NULL, (void*)myThread1, NULL); if(ret ) { printf("Create pthread error!\n"); return 1; } // ret = pthread_create(&id2, NULL, (void*)myThread2, NULL); if(ret ) { printf("Create pthread error!\n"); return 1; } pthread_join(id1,NULL); pthread_join(id2,NULL); return 0; }
实例2:thread_int.c
#include<stdio.h> #include<pthread.h> #include<unistd.h> void *create(void *arg) { int *num; num = (int *)arg; printf("create parameter is %d \n",*num); return (void *)0; } int main() { pthread_ttidp; int error; int test = 4; int *attr = &test; error = pthread_create(&tidp, NULL, create, (void *)attr); if(error) { printf("pthread_create is create is not created ...\n"); return -1; } sleep(1); printf("pthread_create is created ...\n"); return 0; }
实例3:thread_string.c
同thread_int.c
实例4:thread_struct.c
同thread_int.c
实例5:thread_share.c
#include<stdio.h> #include<pthread.h> #include<unistd.h> int a = 1; void *create(void *arg) { printf("new pthread ... \n"); printf("a = $d \n",a); return (void *)0; } int main(int argc, char *argv[]) { pthread_t tidp; int error; int a = 5; printf('a = %d \n',a); error = pthread_create(&tidp, NULL, create, NULL); if(error!=0) { printf("new pthread is not create ... \n"); return -1; } sleep(1); printf("new thread is not create ... \n"); return 0; }
-
终止线程
如果线程中任何一个线程中调用exit或者_exit,那么整个进程都会终止,线程的正确退出方式:
- 线程从启动例程中返回
- 线程可以被另外一个进程终止
- 线程自己调用pthread_exit函数
-
线程退出
头文件
#include<pthread.h>
函数:
void pthread_exit(void * rval_ptr)
功能:终止调用线程
rval_ptr: 线程退出返回值的指针。
例子:thread.c
#include<stdio.h> #include<pthread.h> #include<unistd.h> void *create(void *arg) { printf("new thread iss created ... \n"); return (void *)8; } int main(int argc,char *argv[]) { pthread_t tid; int error; void *temp; error = pthread_create(&tip, NULL, create, NULL); printf("main thread!\n"); if(error) { printf("thread is not created ... \n"); return -1; } error = pthread_join(tip, &temp); if(error) { printf("thread is not exit ... \n"); return -2; } printf("thread is exit code %d \n",(int)temp); return 0; }
-
线程等待
头文件
#include <pthread.h>
函数:
void pthread_join(pthread_t tid, void **rval_ptr)
功能:阻塞调用线程,直到指定的线程终止。
Tid:等待退出的线程id
rval_ptr: 线程退出的返回值的指针
例子:thread_join.c
#include<stdio.h> #include<pthread.h> #include<unistd.h> void *thread(void *str) { int i; for(i = 0; i < 10; ++i) { sleep(2); printf("This in the thread : %d \n",i); } return NULL; } int main() { pthread_t th; int i; void ret = pthread_create(&pth, NULL, thread, (void *)(i)); pthread_join(pth,NULL); printf("123\n"); for(i = 0; i < 10; ++i) { sleep(1); printf("This is the main : %d \n",i); } return 0; }
-
线程标识
头文件
#include <pthread.h>
函数:
void pthread_self(void)
功能:获取调用线程的 thread identifier(返回线程id)
例子:thread_id.c
#include<stdio.h> #include<pthread.h> #include<unistd.h> void *create(void *arg) { printf("new thread ... \n"); printf("This thread's id is %u \n",(unsigned int)pthread_self()); printf("The process pid is %d \n",getpid()); return (void *)0; } int main(int argc, char *argv[]) { pthread_t tid; int error; printf("main thread is starting ... \n"); error = pthread_create(&tid, NULL, create, NULL); if(error) { printf("thread is not created ... \n"); return -1; } printf("The main process's pid is %d \n",getpid()); sleep(1); return 0; }