Linux线程的简单使用
#include <pthread.h>
CFLAGS+= -pthread
LDFLAGS+= -pthread
1.线程创建
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);//(线程id, 线程属性,线程要执行的方法,传入方法的参数)
2.线程退出
void pthread_exit(void *retval);//将retval返回给pthread_join()
3.回收线程。
pthread_join()会阻塞回收线程,直到被回收线程终止。
int pthread_join(pthread_t thread, void **retval);//retval 接收pthread_exit()中返回的数据,retval
4.例子:创建多个线程求质数。
主线程将要处理的数据地址在创建子线程时传入,子线程在处理完数据后将数据地址传回,主线程等待子线程运行完毕并接受返回的数据地址,释放数据所占的内存。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#define LEFT 1
#define RIGHT 100
struct prime_st{
int num;
};
//在线程中执行的方法
static void *prime_fun(void *arg){
int num = ((struct prime_st *)arg)->num;//从参数中获取要处理的数据
int i, tag = 0;
for(i = 2; i <= num / 2; i++){
if(num % i == 0){
tag = 1;
break;
}
}
if(tag == 0)
printf("%d is prime.\n", num);
pthread_exit(arg);//线程退出,并把数据要返回给pthread_join
}
int main(int argc, char const *argv[])
{
int i, n, err;
n = RIGHT - LEFT;
struct prime_st *ptr;
pthread_t tids[n];
void *join_re;//创建变量,接收子线程传回的数据。
for(i = 0; i < n; i++){
ptr = malloc(sizeof(*ptr));
ptr->num = LEFT + i;
//创建线程,将线程要执行的函数地址,和函数参数传入
err = pthread_create(tids + i, NULL, prime_fun, ptr);
if(err){
fprintf(stderr, "create %s\n", strerror(err));
exit(err);
}
}
for(i = 0; i < n; i++){
err = pthread_join(tids[i], &join_re);//等待子线程运行完,接收返回的数据。
if(err){
fprintf(stderr, "join %s\n", strerror(err));
exit(err);
}
free(join_re);
}
return 0;
}