LINUX线程的相关操作api

一般来说,一个进程可以看做有一个控制线程,也可以在这个进程里再开辟多个线程。一个进程在同一时刻只能做一件事情,有了多个线程之后,可以在同一时间做多个事情。同时线程所占用的内存是共享同一个进程的内存,所以不会多开辟内存资源,相对于多进程,多进程的内存资源会很多,一般进程是线程内存的30倍,但是线程也有弱点,如果一个线程崩了,就会直接退出进程,但是多进程的则不会直接退出。多进程比多线程更加强壮。但是线程在程序间的交流更加方便,因为共享同一片内存。多进程之间沟通则非常麻烦复杂。

下面我们来创建一个线程:创建一个线程的api

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

第一个参数所指向的内存单元,被用来设置为新的线程的线程id,第二个参数是设置属性的,可以暂时设置为NULL,第三个参数是一个函数指针,其类型是无符号指针,第四个参数是所要传递的具体数,线程从第三个参数开始运行,运行时,把第四个参数放进第三个函数指针里进行运行。

参数三的理解是你定义了一个函数指针。名字叫 start_routine 。 这个函数的返回值是void *(一个指针) 参数是void *(一个指针) 一般这种写法最好用typedef void* (start_routine)(void ) 。

因此在代码段把参数三进行单独编写时,这样表达void*hanshu(void *mm),一个函数指针的返回值类型是一个指针,那么直接就写成一个指针函数,返回的最后是一个地址。

#include<stdio.h>
#include<pthread.h>
/int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
 void *(*start_routine) (void *), void *arg);
/void pthread_exit(void *retval);
/int pthread_join(pthread_t thread, void **retval);

void*hanshu(void *mm)
{
static int shu1=10;
printf("the son line %ld \n",(unsigned long)pthread_self());
printf("id is %d\n",*((int *)mm));
printf("the line is done\n");
pthread_exit((void *)&shu1);
}
int main()
{
pthread_t t;
int shu=50;
int ret;
int *pret;
printf("the father line %ld\n",pthread_self());
ret=pthread_create(&t,NULL,hanshu,(void *)&shu);
if(ret==0){printf("main is ok\n");}
pthread_join(t,(void**)&pret);
printf("the exit return is %d\n",*pret);
return 0;
}

}

pthread_self()主要是获取线程的id,shu=50,传递进入hanshu函数里面的mm的地址,所以mm也可以被取出来。

pthread_join是用来阻塞主线程的,pthread_exit是退出线程的。如果没有收到来自pthread_exit的退出状态,就一直阻塞在这个地方,shu1相当于一个被回收的地址,里面的值可以在回收后打印出来,这里必须用到static,因为如果是动态变量,那么在子线程被回收后,就没有所谓的函数了,自然也就打印不出来那个回收的值shu1。pthread_join的第二项参数是一个二级指针,那么构造一个指针,然后再把指针的地址放进去就可以了。

最后的运行结果是

the father line 139964430935808
main is ok
the son line 139964422649600 
id is 50
the line is done
the exit return is 10

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值