Linux-多线程(Demo)

这篇博客通过四个示例——创建线程、显示线程ID、线程同步及资源清理,详细介绍了Linux环境下多线程的使用。示例包括创建线程、获取线程ID、阻塞等待线程结束以及异常退出时的资源释放。此外,还涉及到了线程间的数据共享,并提醒在编译时需要链接pthread库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、thread_create.c

创建多线程。

#include <stdio.h>
#include <pthread.h>
void* myThread1(void)
{
        int i;
        for(i=0; i<10; i++)
        {
                printf("This is the 1st pthread \n");
                sleep(1);
        }
}

void* myThread2(void)
{
        int i;
        for(i=0; i<10; i++)
        {
                printf("This is the 2st pthread \n");
                sleep(1);
        }
}

int main()
{
        int i =0;
        int 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_create(&id2, NULL, (void*)myThread2,NULL);
        if(ret)
        {
                printf("Create pthread2 error \n");
                return 1;
        }
        //以阻塞的方式等待id1指定的线程结束。
        pthread_join(id1, NULL);
        pthread_join(id2, NULL);
        return 0;
}

2、thread_id.c

显示线程ID

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

int a=1;
void* create(void *arg)
{
        printf("new thread ... \n");
        //输出线程ID
        printf("This thread's id is %u ...\n",(unsigned int)pthread_self());
        //输出进程ID,该ID与main的进程ID号相同
        printf("This process pid is %d ...\n",getpid());
        return (void*)0;
}

int main(int argc,char* argv[])
{
        pthread_t id;
        int error;
        int* tmp = 10;
        int a = 5;
        printf("a= %d from main \n",a);
        error = pthread_create(&id,NULL,create,NULL);

        sleep(1);
        printf("The main process pid is %d ...\n",getpid());
        sleep(1);
        return 0;
}

3、thread_join.c

以阻塞的方式等待thread指定的线程结束。

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

int a=1;
void* create(void *arg)
{
        int i ;
        for(i=0;i < 5;i++)
        {
                sleep(2);
                printf("this is in thread : %d ...\n",i);
        }
        return NULL;
}

int main(int argc,char* argv[])
{
        pthread_t id;
        int error;
        int* tmp = 10;
        int i;
        printf("a= %d from main \n",a);
        error = pthread_create(&id,NULL,create,NULL);
        //pthread_join(id,NULL);//以阻塞的方式等待id1指定的线程结束。然后再执行下面的代码
        printf("123\n");
        for(i = 0; i < 5;i++)
        {
                sleep(1);
                printf("this is in main : %d ...\n",i);
        }
        return 0;
}

4、thread_clean.c

线程异常退出时的资源释放。

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

void* clean(void* arg)
{
        printf("clean : %s\n",(char*)arg);
        return 0;
}

void* fun1(void *arg)
{
        printf("thread 1 start ...\n");
        pthread_cleanup_push((void*)clean,"thead 1 first ...");
        pthread_cleanup_push((void*)clean,"thead 1 second ...");
        printf("thread 1 push complete \n");
        if(arg)
        {
                return (void*)1;//return返回时,不执行push的clean函数
        }
        pthread_cleanup_pop(0);
        pthread_cleanup_pop(0);
        return (void*)1;
}

void* fun2(void *arg)
{
        printf("thread 2 start ...\n");
        pthread_cleanup_push((void*)clean,"thead 2 first ...");
        pthread_cleanup_push((void*)clean,"thead 2 second ...");
        printf("thread 2 push complete \n");
        if(arg)
        {
                pthread_exit((void*)1);
        }
        pthread_cleanup_pop(0);//该函数参数为0,并且在线程异常退出或者程序调用pthread_exit的时候(不包括return),会执行push进来的clean函数
        pthread_cleanup_pop(0);
        return (void*)1;
}

int main(int argc,char* argv[])
{
        pthread_t id1,id2;
        int error;
        int* tmp = 10;
        error = pthread_create(&id1,NULL,fun1,"hello");

        if(error !=0)
        {
                printf("create thread 1 error\n");
        }

        pthread_join(id1,NULL);
        error = pthread_create(&id2,NULL,fun2,"hello");

        if(error !=0)
        {
                printf("create thread 2 error\n");
        }
        //pthread_join(id1,NULL);
        pthread_join(id2,NULL);
        return 0;
}

5、thread_exit.c

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

int a=1;
void* create(void *arg)
{
        printf("new thread ... \n");
        return (void*)8;
}

int main(int argc,char* argv[])
{
        pthread_t id;
        int error;
        void* temp;
        error = pthread_create(&id,NULL,create,NULL);

        if(error)
        {
                printf("thread is not created ... \n");
        }
        error = pthread_join(id,&temp);//temp存储了线程返回值
        if(error)
        {
                printf("thread is not exit \n");
                return -2;
        }
        printf("thread is  exit %d ...",(int)temp);
        return 0;
}

6、thread_int.c

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

void* create(void *arg)
{
        printf("this arg is %d \n",(int*)arg);
        return (void*)0;
}

int main(int argc,char* argv[])
{
        pthread_t id;
        int error;
        int* tmp = 10;
        char* ch = "hello world";
        error = pthread_create(&id,NULL,create,(void*)tmp);

        sleep(1);
        printf("prhead_create is created ...\n");
        return 0;
}

7、thread_share.c

线程与进程共享数据段

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

int a=1;
void* create(void *arg)
{
        printf("new thread ... \n");
        printf("a=%d from pthread...\n",a);
        a++;
        return (void*)0;
}

int main(int argc,char* argv[])
{
        pthread_t id;
        int error;
        int* tmp = 10;
        int a = 5;
        printf("a= %d from main \n",a);
        error = pthread_create(&id,NULL,create,NULL);

        sleep(1);
        printf("prhead_create is created ...\n");
        printf("a= from main2 ... \n%d",a);
        return 0;
}

编译的时候要注意下,加参数-lpthread

g++ demo.cpp -lpthread


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值