linux的多线程操作

1.pthread函数介绍

int pthread_create (pthread_t __restrict __newthread,const pthread_attr_t *__restrict __attr,void (__start_routine) (void ),void *__restrict __arg), 创建线程,其中__attr和__arg可用为NULL,使用默认参数创建线程,并且线程函数无输入参数;

int pthread_join (pthread_t __th, void **__thread_return);等待线程退出后返回,获取线程的返回值,并且释放线程资源和线程ID号;__thread_return可以为NULL,不关心返回值;并且线程必须是非分离线程PTHREAD_CREATE_JOINABLE;

int pthread_detach(pthread_t thread);将已经运行中的线程设定为分离状态;

int pthread_attr_init (pthread_attr_t *__attr), 初始化pthread创建参数;

int pthread_attr_destroy (pthread_attr_t *__attr),销毁pthread创建参数;

int pthread_attr_getdetachstate (const pthread_attr_t *__attr,int *__detachstate)获取线程参数中的分离状态;

int pthread_attr_setdetachstate (pthread_attr_t *__attr, int __detachstate)设定线程的分离状态
PTHREAD_CREATE_DETACHED或者PTHREAD_CREATE_JOINABLE;

int pthread_attr_setinheritsched (pthread_attr_t *__attr, int __inherit)设定线程调度策略的继承属性,该函数必须在root权限下调用;

int pthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy),设定线程的调度策略;

int pthread_attr_getschedparam (const pthread_attr_t *__restrict __attr, struct sched_param *__restrict __param),获取参数中的线程优先级;

int pthread_attr_setschedparam (pthread_attr_t *__restrict __attr, const struct sched_param *__restrict __param),设定线程的优先级;

int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope); 设定线程优先级的可竞争范围:contentionscope设定为PTHREAD_SCOPE_SYSTEM,则线程与整个linux系统的所有线程以设定优先级抢占CPU;PTHREAD_SCOPE_PROCESS则是表示,线程只与当前进程中的所有线程以设定优先级抢占CPU; 

2.示例程序

示例程序是为了测试创建线程,给线程传参,给线程传多个参,等待子线程等功能

要注意:

不带参数的线程,也要写成传参格式为void *arg ,返回值为void *的格式

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>

void *say_hello(void *arg)
{
	printf("hello\n");
	return 0;
}

int main()
{
	pthread_t pid[5];

	for( int i = 0 ; i < 5 ; i++ )
	{
		int ret = pthread_create( &pid[i] , NULL , say_hello , NULL );
		if( ret != 0 )
			printf("error\n");
	}
	pthread_exit(NULL);
	return 0;
}

若要传参,传参之前把他转化成void *,线程中解析该参数时再转化回原来的类型使用。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>

void *say_hello(void *index)
{
	int tmp = *((int *)index);
	printf("thread ID = %d\n" , tmp);
	return 0;
}

int main()
{
	int index[5];
	pthread_t pid[5];
	for( int i = 0 ; i < 5 ; i++ )
	{
		index[i] = i;
		int ret = pthread_create( &pid[i] , NULL , say_hello , (void *)(&index[i]) );
		if( ret != 0 )
			printf("create pthread error\n");
	}
	pthread_exit(NULL);
	return 0;
}

若要传多个参数可以传结构体地址进去,也可以传结构体指针

pthread_join()等待函数会阻塞等到该线程运行结束才会继续向下执行

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>

struct para
{
	char *str;
	int time;
};

void *send_message(void *p)
{
	struct para *tmp = (struct para *)p;
	printf("tmp str = %s\n" , tmp->str);
	sleep(tmp->time);
	printf("tmp time = %d\n" , tmp->time);
	return 0;
}

int main()
{
	pthread_t thread1 , thread2;
	void *retval;
	struct para *para1 = (struct para *)malloc(12);
	para1->str = "sjn";
	para1->time = 1;
	struct para *para2 = (struct para *)malloc(12);
	para2->str = "1015";
	para2->time = 2;
	int ret = pthread_create(&thread1 , NULL , send_message , (void *)para1);
	if(ret != 0)
		printf("error\n");
	ret = pthread_create(&thread2 , NULL , send_message , (void *)para2);
	if(ret != 0)
		printf("error\n");
#if 0
	pthread_join(thread1 , &retval);
#else
	pthread_join(thread2 , &retval);
#endif
	return 0;
}

若#if 1则等待thread1运行结束,所以第一秒之前thread1打印sjn,thread2打印1015,第一秒之后,thread1打印1,然后退出,这时主线程pthread_join退出等待,程序退出。那么打印结果如下

若#if 0则等待thread2运行结束,所以第一秒之前thread1打印sjn,thread2打印1015,第一秒之后,thread1打印1,然后退出,第二秒之后thread2打印2,这时主线程pthread_join退出等待,程序退出。那么打印结果如下


转载一篇好全的博客:https://blog.csdn.net/joysonqin/article/details/70237422

猜你喜欢

转载自blog.csdn.net/wssjn1994/article/details/85704698