获取线程的线程id
在每一个线程都会有唯一标识的线程ID,在线程环境之下,线程ID是唯一的,如果在整个系统中线程ID不一定唯一。
#include <pthread.h>
/**
* [pthread_self 获取线程的线程id]
* @return [线程id]
*/
pthread_t pthread_self(void);
创建
#include <pthread.h>
/**
参数1:thread指针返回创建成功的线程id;
参数2:attr结构体指针,在创建线程的时候用于设置线程的属性,可以使用NULL表示是采用默认线程属性。
参数3:start_routine函数指针,指向的线程指向函数;在线程创建成功按照线程执行函数执行(函数需要由用户设计)
void * thread_func(void *arg) {
/ 函数体的执行语句需要由用户根据用户需求设计 /
}
参数4:arg给线程执行函数传递的参数。
返回值:成功返回0,失败返回线程的错误号,并且线程id没有做定义
*/
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
注意
-
线程创建成功,子线程和主线程的执行顺序式随机的。
-
线程创建成功,子线程共享主线程对应进程的资源和数据。
-
在线程创建的时候,可以给线程执行函数传递参数。参数根据用户需求进行封装。
-
在创建线程的时候,如果创建的多个线程调用的同一个线程执行函数,每一个线程会按照直接的运行。相互之间不会影响。
实例
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
/* 定义video子线程执行函数 */
void *video_func(void *arg)
{
while(1)
{
printf("video pthread : %lu\n", pthread_self());
sleep(1);
}
}
int main()
{
int ret;
pthread_t video_id;
/* 创建一个子线程:video */
ret = pthread_create(&video_id, NULL, video_func, NULL);
if (ret != 0)
{
fprintf(stderr, "create video pthread fail\n");
return -1;
}
/* 主线程 */
while(1)
{
printf("video_id = %lu\n", video_id);
sleep(1);
}
}
线程退出
#include <pthread.h>
/**
* [pthread_exit 退出线程]
* @param retval [返回线程退出的返回值; (在子线程线程执行函数中使用return 返回值 形式退出)。]
*/
void pthread_exit(void *retval);
实例
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
/* 定义video子线程执行函数 */
void *video_func(void *arg)
{
while(1)
{
printf("video pthread : %lu\n", pthread_self());
sleep(1);
}
}
void *serial_func(void *arg)
{
int i = 5;
while(--i)
{
printf("serial pthread : %lu\n", pthread_self());
sleep(1);
}
//pthread_exit("sfdsgdg");
return "sssssssss";
}
int main()
{
int ret;
pthread_t video_id;
pthread_t serial_id;
/* 创建一个子线程:video */
ret = pthread_create(&video_id, NULL, video_func, NULL);
if (ret != 0)
{
fprintf(stderr, "create video pthread fail\n");
return -1;
}
/* 创建一个子线程:video */
ret = pthread_create(&serial_id, NULL, serial_func, NULL);
if (ret != 0)
{
fprintf(stderr, "create video pthread fail\n");
return -1;
}
/* 主线程 */
while(1)
{
printf("main pthread\n");
sleep(5);
//pthread_exit(NULL);
//return ;
}
}
子线程资源回收
#include <pthread.h>
/**
* [pthread_join 阻塞等待指定子线程退出,并接收子线程退出的返回值]
* @param thread [等待的子线程的线程id]
* @param retval [二级指针,指向的是线程退出返回值空间的地址。类型需要根据用户需求定义。
如果设置位NULL,表示不关心子线程退出的状态]
* @return [成功返回0,失败返回错误号]
*/
int pthread_join(pthread_t thread, void **retval);
实例
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
/* 定义video子线程执行函数 */
void *video_func(void *arg)
{
int i = 10;
int a = 24;
while(--i)
{
printf("video pthread : %lu\n", pthread_self());
sleep(1);
}
pthread_exit(&a);
}
void *serial_func(void *arg)
{
int i = 5;
while(--i)
{
printf("serial pthread : %lu\n", pthread_self());
sleep(1);
}
//pthread_exit("sfdsgdg");
return "1safsh";
}
int main()
{
int ret;
pthread_t video_id;
pthread_t serial_id;
/* 创建一个子线程:video */
ret = pthread_create(&video_id, NULL, video_func, NULL);
if (ret != 0)
{
fprintf(stderr, "create video pthread fail\n");
return -1;
}
/* 创建一个子线程:video */
ret = pthread_create(&serial_id, NULL, serial_func, NULL);
if (ret != 0)
{
fprintf(stderr, "create video pthread fail\n");
return -1;
}
int *retval;
/* 主线程 */
pthread_join(video_id, (void **)&retval);
printf("%d\n", *retval);
char *retVal;
pthread_join(serial_id, (void **)&retVal);
printf("%s\n", retVal);
}
取消线程
#include <pthread.h>
#include <pthread.h>
/**
* [pthread_cancel 在主线程中调用用于取消指定线程id的线程]
* @param thread [thread表示需要取消线程的id]
* @return [成功返回0,失败返回错误号]
*/
int pthread_cancel(pthread_t thread);
实例
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
/* 定义video子线程执行函数 */
void *video_func(void *arg)
{
while(1)
{
printf("video pthread : %lu\n", pthread_self());
sleep(1);
}
pthread_exit(NULL);
}
void *serial_func(void *arg)
{
while(1)
{
printf("serial pthread : %lu\n", pthread_self());
sleep(1);
}
return "1safsh";
}
int main()
{
int ret;
pthread_t video_id;
pthread_t serial_id;
/* 创建一个子线程:video */
ret = pthread_create(&video_id, NULL, video_func, NULL);
if (ret != 0)
{
fprintf(stderr, "create video pthread fail\n");
return -1;
}
/* 创建一个子线程:video */
ret = pthread_create(&serial_id, NULL, serial_func, NULL);
if (ret != 0)
{
fprintf(stderr, "create video pthread fail\n");
return -1;
}
sleep(5);
/* 主线程中取消serial_id线程 */
ret = pthread_cancel(serial_id);
if (ret != 0)
{
fprintf(stderr, "create serial pthread fail\n");
return -1;
}
sleep(5);
/* 主线程中取消vide_id线程 */
ret = pthread_cancel(video_id);
if (ret != 0)
{
fprintf(stderr, "create video pthread fail\n");
return -1;
}
}
分离线程
#include <pthread.h>
/**
* [pthread_detach 分离线程,子线程分离后,子线程退出的时候自己会做资源的回收]
* @param thread [分离线程的id]
* @return [成功返回0,失败返回错误号]
PS:分离的子线程,不能在主线程使用pthread_join()
*/
int pthread_detach(pthread_t thread);
实例
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
/* 定义video子线程执行函数 */
void *video_func(void *arg)
{
int i = 10;
int a = 24;
while(--i)
{
printf("video pthread : %lu\n", pthread_self());
sleep(1);
}
pthread_exit(&a);
}
void *serial_func(void *arg)
{
int i = 5;
while(--i)
{
printf("serial pthread : %lu\n", pthread_self());
sleep(1);
}
//pthread_exit("sfdsgdg");
return "1safsh";
}
int main()
{
int ret;
pthread_t video_id;
pthread_t serial_id;
/* 创建一个子线程:video */
ret = pthread_create(&video_id, NULL, video_func, NULL);
if (ret != 0)
{
fprintf(stderr, "create video pthread fail\n");
return -1;
}
/* 分离video_id线程 */
ret = pthread_detach(video_id);
if (ret != 0)
{
fprintf(stderr, "detach video pthread fail\n");
return -1;
}
/* 创建一个子线程:video */
ret = pthread_create(&serial_id, NULL, serial_func, NULL);
if (ret != 0)
{
fprintf(stderr, "create video pthread fail\n");
return -1;
}
/* 分离serial_id线程 */
ret = pthread_detach(serial_id);
if (ret != 0)
{
fprintf(stderr, "detach serial pthread fail\n");
return -1;
}
#if 0
int *retval;
/* 主线程 */
pthread_join(video_id, (void **)&retval);
printf("%d\n", *retval);
char *retVal;
pthread_join(serial_id, (void **)&retVal);
printf("%s\n", retVal);
#else
pthread_exit(NULL);
#endif
}
网友评论