Linux线程的简单使用

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值