linux下的多线程

来源:互联网 发布:南京烘焙培训班 知乎 编辑:程序博客网 时间:2024/05/10 03:10
 

linux 多线程程序设计(thread)
进程(分配独立的地址空间,代码段(shm)、数据段(cpy)、堆栈段(cpy))----线程(都共享、一个线程的数据可以直接为其他线程所用、快捷)【多任务,并发的工作方式】

linux系统下的多线程遵循 POSIX线程接口,称为:pthread

创建线程(执行所指定的函数,执行完了线程就结束了)
int pthread_create(pathread_t *tidp/*线程id*/,const pthread_attr_t *attr/*线程属性置为NULL*/,void *(*start_rtn)(void)/*线程要执行的函数*/,void *arg/*start_rnt参数*/)

pthread 的库不是linux系统的库,所以编译时用:gcc filename -lpthread -o xxxx

//thread_creat.c
#include<stdio.h>
#include<pthread.h>


void *mythread1(void)
{
 int i;
 for(i=0;i<100;i++)
 {
  printf("this is the 1st pathread creat by zieckey!\n");
  sleep(1);

 }
}

void *mythread2(void)
{
 int i;
 for(i=0;i<100;i++)
 {
  
  printf("this is the 2st pathread creat by zieckey!\n");
  sleep(1);

 }
}
int main()
{
 int i=0,ret=0;
 pthread_t id1,id2;
 
 ret=pthread_create(&id1,NULL,(void *)mythread1,NULL);
 if(ret)
 {
  printf("create pthread1 error!\n");
  return -1;
 }
 
 ret=pthread_crreat(&id2,NULL,(void *)mythread2,NULL);
 if(ret)
 {
  printf("creat pthread2 error!\n");
  return -1;
 }
 pthread_join(id1,NULL);
 pthread_join(id2,NULL);
 
 return 0;
}


//thread_init.c

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>

void *creat(void *arg)
{
 int *num;
 num=(int *)arg;
 printf("creat parameter is %d \n",*num);
 return (void *)0;
}
int main(int argc,char *argv[])
{
 pthread_t tidp;
 int error;

 int test=4;
 int *attr=&test;

 error=pthread_creat(&tidp,NULL,creat,(void *)attr);
 
 if(error)
 {
  printf("pthread_creat is created is not created...\n");
  return -1;
 }
 sleep(1);
 printf("pthread_creat is created ...\n");
}


//thread_share.c(线程共享数据段)

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>

int a=1;//在数据段里

void *create(void *arg)
{
 printf("new pthread ...\n");
 printf("a=%d\n",a);
 a++;
 return (void *)0;
}
int main(int argc,char *argv[])
{
 pthread_t tidp;
 int error;
 
 int a=5;//在栈里
 printf("in main 1 a=%d\n",a);
 
 error=pthread_creat(&tidp,NULL,creat,NULL);

 if(error!=0)
 {
  printf("new thread is not creat ...\n");
  return -1;
 }
 sleep(3);
 printf("in main 2 a=%d\n",a);

 printf("new thread is creat...\n");
 return 0;
}

终止线程:pthread_exit
exit、_exit;终止进程的函数

#include<pthread.h>
void pthread_exit(void *rval_ptr)
rval_ptr:线程退出返回值的指针


线程等待:
#include<pthread.h>
int pthread_join(pthread_t tid,void **rval_ptr)

线程标识:获取调用线程的thread identifiler
#include<pthread.h>
pthread_t pthread_self(void)

 

#include<stdio.h>
#include<pthread.h>

void *mythread(void *arg)
{

  printf("new thread...\n");
  printf("this thread's id is %u\n",(unsigned int)pthread_self());//获取线程ID
  printf("the process pid is %d \n",getpid());//获得进程ID
 
 return (void *)0; 
}


int main(int argc,char*argv[])
{
 int ret;
 pthread_t id;
 
 ret=pthread_create(&id,NULL,(void *)mythread,NULL);
 if(ret)
 {
  printf("create pthread error!\n");
  return -1;
 }
 printf("the main process's pid is %d \n",getpid());
 sleep(1);
 
 return 0;
}

清除
终止方式:正常终止和非正常终止
#include<pthread.h>【进栈出栈】

pthread_cleanup_push(void(*rtn)(void *),void *arg)
rtn:清除函数
arg:清除函数的参数

pthread_cleanup_pop(int execute)


execute:为0时,函数不执行

#include<stdio.h>
#include<pthread.h>

void *clean(void *arg)
{
 printf("cleanup :%s",(char *)arg);
}
void *mythread1(void)
{
 printf("thread 1 start \n");
 pthread_cleanup_push((void*)clean,"thread 1 first hander");
 pthread_cleanup_push((void*)clean,"thread 1 second hander");
 printf(""thread 1 push complete \n);
 if(arg)
 {
  return((void *)1);
 }
 pthread_cleanup_pop(0);
 pthread_cleanup_pop(0);
 return ((void *)1);
}

void *mythread2(void)
{
 printf("thread 2 start \n");
 pthread_cleanup_push((void*)clean,"thread 2 first hander");
 pthread_cleanup_push((void*)clean,"thread 2 second hander");
 printf(""thread 2 push complete \n);
 if(arg)
 {
  return((void *)2);
 }
 pthread_cleanup_pop(0);
 pthread_cleanup_pop(0);
 return ((void *)2);
}


int main(void)
{
 int ret;
 pthread_t id1,id2;
 
 ret=pthread_create(&id1,NULL,(void *)mythread1,NULL);
 if(ret)
 {
  printf("create pthread1 error!\n");
  return -1;
 }
 
 ret=pthread_crreat(&id2,NULL,(void *)mythread2,NULL);
 if(ret)
 {
  printf("creat pthread2 error!\n");
  return -1;
 }
 pthread_join(id1,NULL);
 pthread_join(id2,NULL);
 
 return 0;

原创粉丝点击