线程创建等待消除

1、创建线程thread_create.c

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

void *myThread1(void)
{
    int i;
    for (i=0; i<100; i++)
    {
        printf("This is the 1st pthread,created by zieckey./n");
        sleep(1);//Let this thread to sleep 1 second,and then continue to run
    }
}

void *myThread2(void)
{
    int i;
    for (i=0; i<100; i++)
    {
        printf("This is the 2st pthread,created by zieckey./n");
        sleep(1);
    }
}

int main()
{
    int i=0, ret=0;
    pthread_t id1,id2;
   
    /*创建线程1*/
    ret = pthread_create(&id1, NULL, (void*)myThread1, NULL);
    if (ret)
    {
        printf("Create pthread error!/n");
        return 1;
    }
   
    /*创建线程2*/
    ret = pthread_create(&id2, NULL, (void*)myThread2, NULL);
    if (ret)
    {
        printf("Create pthread error!/n");
        return 1;
    }
   
    pthread_join(id1, NULL);
    pthread_join(id2, NULL);
   
    return 0;
}

 

终端命令:gcc thread_create.c -lpthread -o thread_create  //编译时必须加上 -lpthread

               ./thread_create

 

2、thread_int.c线程传送整型数据

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

void *create(void *arg)
{
    int *num;
    num=(int *)arg;//将void*指针强制转换为int*指针
    printf("create 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_create(&tidp,NULL,create,(void *)attr); //tidp为线程id、线程属性一般为空、线程要执行的函数、有参数attr

    if(error)
        {
        printf("pthread_create is created is not created ... /n");
        return -1;
        }
    sleep(1);
    printf("pthread_create is created .../n");
    return 0;       
}
终端命令:gcc thread_int.c -lpthread -o thread_int

               ./thread_int

显示:create parameter is 4

         pthread_create is created ...

 

3、传递字符串 thread_string.c

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

void *create(void *arg)
{
    char *name;
    name=(char *)arg;//void指针强制转换为 char指针
    printf("The parameter passed from main function is %s  /n",name);
    return (void *)0;
}

int main(int argc, char *argv[])
{
    char *a="zieckey";
    int error;
    pthread_t tidp;

    error=pthread_create(&tidp, NULL, create, (void *)a);//强制转换为void*

    if(error!=0)
    {
        printf("pthread is not created./n");
        return -1;
    }
    sleep(1);
    printf("pthread is created... /n");
    return 0;
}   

 

4、thread_share.c进程与线程共享内存数据段

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

//static int a=4;

int a = 1;

void *create(void *arg)
{
    printf("new pthread ... /n");
    printf("a=%d  /n",a);//a=1

   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);//此处a=1
    
    error=pthread_create(&tidp, NULL, create, NULL);

    if(error!=0)
    {
        printf("new thread is not create ... /n");
        return -1;
    }
   
    sleep(3);

   printf("in main 2:a=%d/n",a);//a=2
    
    printf("new thread is created ... /n");
    return 0;
}

5、线程的终止

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

void *create(void *arg)
{
    printf("new thread is created ... /n");
    return (void *)8;

  //exit(0);换成这句直接退出了线程和进程,不执行主函数里的printf("thread is exit code %d /n", (int )temp)
  //thread_exit((void *)8);换成这句可以,thread_exit只退出线程
}

int main(int argc,char *argv[])
{
    pthread_t tid;
    int error;
    void *temp;

    error = pthread_create(&tid, NULL, create, NULL);
    printf("main thread!/n");

    if( error )
    {
        printf("thread is not created ... /n");
        return -1;
    }
    error = pthread_join(tid, &temp);// pthread_join线程等待函数tid等待退出的线程ID,&temp线程退出的返回值的指针

    if( error )
    {
        printf("thread is not exit ... /n");
        return -2;
    }
   
    printf("thread is exit code %d /n", (int )temp);
    return 0;
}

结果:main thread!

         new thread is created ...

         thread is exit code 8

 

6、线程等待

#include  <pthread.h>

int pthread_join(pthread_t tid,void **rval_ptr)

功能:阻塞线程,直到指定的线程终止

tid线程ID, rval_ptr线程退出的返回值指针

 

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
void *thread(void *str)
{
    int i;
    for (i = 0; i < 3; ++i)//连续十次打印,每次有睡眠
    {
        sleep(2);
        printf( "This in the thread : %d/n" , i );
    }
    return NULL;
}

int main()
{
    pthread_t pth;
    int i;
    int ret = pthread_create(&pth, NULL, thread, (void *)(i));
   
    pthread_join(pth, NULL);//等待线程结束
    printf("123/n");
    for (i = 0; i < 3; ++i)
    {
        sleep(1);
        printf( "This in the main : %d/n" , i );
    }
   
    return 0;
}

 

7、pthread_t pthread_self(void)函数获得线程ID

#include <stdio.h>
#include <pthread.h>
#include <unistd.h> /*getpid()*/

void *create(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,线程是属于进程的,所以此处ID是进程的ID。
    return (void *)0;
}

int main(int argc,char *argv[])
{
    pthread_t tid;
    int error;

    printf("Main thread is starting ... /n");

    error = pthread_create(&tid, NULL, create, NULL);

    if(error)
    {
        printf("thread is not created ... /n");
        return -1;
    }
    printf("The main process's pid is %d  /n",getpid());//进程ID,与上面的ID相同
    sleep(1);
    return 0;
}

 

8、清除

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *clean(void *arg)
{
    printf("cleanup :%s  /n",(char *)arg);
    return (void *)0;
}
void *thr_fn1(void *arg)
{
    printf("thread 1 start  /n");
    pthread_cleanup_push( (void*)clean,"thread 1 first handler");//push
    pthread_cleanup_push( (void*)clean,"thread 1 second hadler");
    printf("thread 1 push complete  /n");
    if(arg)
    {
        return((void *)1);//return是特例,所以不执行clean
    }
    pthread_cleanup_pop(0);
    pthread_cleanup_pop(0);
    return (void *)1;
}
void *thr_fn2(void *arg)
{
    printf("thread 2 start  /n");//这个肯定执行
    pthread_cleanup_push( (void*)clean,"thread 2 first handler");//push将clean压入栈,在pop之前有退出(不包括return退出)则执行clean函数
    pthread_cleanup_push( (void*)clean,"thread 2 second handler");//栈中函数遵循“先进后出”原则
    printf("thread 2 push complete  /n");
    if(arg)
    {
        pthread_exit((void *)2);
    }
    pthread_cleanup_pop(0);//如果没有pthread_exit函数,也不会执行clean。但是改为pop(1),即使中间没有退出,到pop时因为是1也执行clean
    pthread_cleanup_pop(0);
    pthread_exit((void *)2);
}
int main(void)
{
    int err;
    pthread_t tid1,tid2;
    void *tret;

    err=pthread_create(&tid1,NULL,thr_fn1,(void *)1);
    if(err!=0)
    {
        printf("error .... /n");
        return -1;
    }
    err=pthread_create(&tid2,NULL,thr_fn2,(void *)1);

    if(err!=0)
    {
        printf("error .... /n");
        return -1;
    }
    err=pthread_join(tid1,&tret);
    if(err!=0)
    {
        printf("error .... /n");
        return -1;
    }
    printf("thread 1 exit code %d  /n",(int)tret);

    err=pthread_join(tid2,&tret);
    if(err!=0)
    {
        printf("error .... ");
        return -1;
    }

    printf("thread 2 exit code %d  /n",(int)tret);
   
    return 1;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ANTRK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值