线程的创建和调度
1、线程的创建
pthread_create创建线程
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
参数:
- pthread_t *thread 指定创建线程id
- const pthread_attr_t *attr;NULL
- void (start_routine) (void *): 线程函数
- void *arg:线程参数
返回值:成功,返回0,;出错,返回错误值;
2、等待线程的返回值
pthread_join();等待线程返回值
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
参数:
- pthread_t thread :线程ID号
- void **retval:线程返回结果
返回值:成功,返回0;失败,返回错误号;
3、获取线程自身线程ID
pthread_self();
#include <pthread.h>
pthread_t pthread_self(void);
参数:无
返回值:自身线程ID;
4、判断线程是否为同一个线程
pthread_equal()
#include <pthread.h>
int pthread_equal(pthread_t t1, pthread_t t2);
参数:
- 线程1的ID
- 线程2的ID
返回值:相同,返回非0;不相同,返回0;
5、取消指定线程
pthread_cancel();
#include <pthread.h>
int pthread_cancel(pthread_t thread);
参数:线程ID号
返回值:成功,返回0;失败,返回非0;
#include <stdio.h>
#include <pthread.h>
// 线程函数:用于提供线程的执行指令代码
void *thread_func1(void *arg);
void *thread_func2(void *arg);
int main(int argc, char *argv[])
{
pthread_t thread_id1;
pthread_t thread_id2;
// 创建线程并指定线程的执行函数
pthread_create(&thread_id1, NULL, thread_func1, NULL);
pthread_create(&thread_id2, NULL, thread_func2, NULL);
// 等待指定线程的退出
// 注意:主线程退出,则进程退出,该进程下的相关线程全部退出
pthread_join(thread_id1, NULL);
pthread_join(thread_id2, NULL);
return 0;
}
void *thread_func1(void *arg)
{
while(1)
printf("A");
pthread_exit(NULL);
}
void *thread_func2(void *arg)
{
while(1)
printf("B");
pthread_exit(NULL);
}
//使用双线程求解1~100的和
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
// 定义传递个线程的参数结构类型
struct thread_arg
{
int thread_no; // 线程编号(自定义的)
int lower; // 区间下限
int upper; // 区间上限
// int sum; // 传出结果方法2,可以用作接收线程计算完毕后返回的整数结果
};
// 定义用于传递线程参数使用的全部变量,每一个线程一个
struct thread_arg argument1, argument2;
// 线程函数:用于提供线程执行的指令代码
void *add_thread_func(void *arg);
int main(int argc, char *argv[])
{
pthread_t thread_id1;
pthread_t thread_id2;
// 定义指向线程返回结果空间的地址
int *psum1 = NULL;
int *psum2 = NULL;
// 创建线程1
argument1.thread_no = 1;
argument1.lower = 1;
argument1.upper = 50;
pthread_create(&thread_id1, NULL, add_thread_func, &argument1);
// 创建线程2
argument2.thread_no = 2;
argument2.lower = 51;
argument2.upper = 100;
pthread_create(&thread_id2, NULL, add_thread_func, &argument2);
// 等待线程的退出,并接收线程返回值
pthread_join(thread_id1, &psum1);
pthread_join(thread_id2, &psum2);
printf("sum = %d\n", *psum1+*psum2);
// 释放从线程中得到的结果空间
free(psum1);
free(psum2);
return 0;
}
// 线程函数
void *add_thread_func(void *arg)
{
struct thread_arg *p_arg = (struct thread_arg *)arg;
int i = 0;
int sum = 0;
int *p_res = NULL;
// 累和
for(i = p_arg->lower; i < p_arg->upper+1; i++)
sum += i;
//printf("in thread no %d : sum = %d\n", p_arg->thread_no, sum);
// 开辟空间存放结果
p_res = (int *)malloc(sizeof(int));
*p_res = sum;
// 返回结果方法2,使用线程参数使用的全局变量返回
//p_arg->sum = sum;
// 线程返回结果并退出
pthread_exit(p_res);
}