Linux c 多线程 互斥量

本文详细介绍了多线程编程的基础知识,包括多线程的历史背景、实现方式、创建方法及控制手段,并通过示例代码展示了如何使用互斥锁解决多线程中的数据同步问题。

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

多线程:

1.      了解多线程

        解决多任务实现

        历史上Unix服务器不支持多线程

        Unix/Linux上实现多线程有两种方法:

              内核支持多线程

              使用进程的编程技巧封装进程实现多线程:轻量级多线程

              多线程的库:

                    libpthread.so   -l pthread

                    pthread.h

        

           

2.      创建多线程

2.1.代码:

回调函数

2.2.线程ID

     pthread_t(类型)

2.3.运行线程

      pthread_create

         #include<pthread.h>

                 int pthread_create(

                               pthread_t *th,//返回进程ID

                               constpthread_attr_t  *attr,//线程属性,为NULL/0,使用进程的默认属性

                               void*(*run)(void*),//线程代码

                               void *data);//传递线程代码的数据

例子代码:

#include<stdio.h>

#include<pthread.h>

 

 

void* run(void *  data)

{

      printf(“我是线程\n”);

}

 

void  main()

{

       pthread_t  tid;

       pthread_create(&tid,0,run,0);

}

 

编译命令:gcccreateth.c –o main  -l pthread

 

结论:

1.      程序结束所有子线程就结束

       解决办法:等待子线程结束

                 sleep

                 pthread_join函数

2.      创建子线程后,主线程继续完成系统分配时间片

3.      子线程结束就是线程函数返回

4.      子线程和主线程有同等优先级

 

#include<stdio.h>

#include<pthread.h>

#include<stdlib.h>

 

 

void* run(void *  data)

{

      printf(“我是线程\n”);

}

 

void  main()

{

       pthread_t  tid;

       pthread_create(&tid,0,run,0);

       sleep(1);

}

 

pthread_join函数:

 

int pthread_join(pthread_t  thread ,//等待的线程id

void ** value_ptr); //子线程结束的返回值

 

#include<stdio.h>

#include<pthread.h>

 

 

void* run(void *  data)

{

      printf(“我是线程\n”);

}

 

void  main()

{

       pthread_t  tid;

       pthread_create(&tid,0,run,0);

       pthread_join(tid,(void**)0);

}

 

 

3.      线程的基本控制

      线程的状态:

         ready(准备状态)->runny->deady

                             |

                           sleep/pause

     怎么结束线程:

        内部自动结束:(建议)

         return 返回值 (在线程函数中使用)

         void pthread_exit(void * value)(任何线程代码中使用)

        外部结束一个线程。

              int   pthread_cancel(pthread_t  thread);

   

       

例子:

#include<stdio.h>

#include<pthread.h>

void*  run(void * data)

{

       printf(“我是线程\n”);

       //return “world”;

       pthread_exit(“world”);

}

void   main()

{

       pthread_t   tid;

       char *re;

       pthread_create(&tid,0,run,0);

       pthread_join(tid,&re);

       printf(“%s\n”,re);

}

 

程序打印:world

 

4.      多线程的问题

5.      多线程问题的解决

      互斥锁(互斥量)mutex

      1.定义互斥量  pthread_mutex_t

      2.初始化互斥量1   pthread_mutex_init

      3.互斥量操作置0 pthread_mutex_lock

                         判定互斥量0:阻塞

                                     1:置0 ,返回

                 置1  pthread_mutex_unlock

                          置1,返回

5.释放互斥量pthread_mutex_destroy

 

例子代码:

 

#include<stdio.h>

#include<pthread.h>

 

pthread_mutex_t  m;

 

void  display()

{

    pthread_mutex_lock(&m);

a++;

b++;

if(a!=b)

{

      printf(“%d!=%d”,a,b);

}

Pthread_mutex_unlock(&m);

}

 

void * r1(void *data)

{

      while(1)

      {

           display();

      }

}

 

void*  r2(void * data)

{

      while(1)

      {

         display();

      }

}

 

 

void  main()

{

      pthread_t t1,t2;

      pthread_mutex_init(&m,0);

     pthread_create(&t1,0,r1,0);

        pthread_create(&t2,0,r2,0);

        pthread_join(t1,(void**)0);

        pthread_join(t2,(void**)0);

        pthread_mutex_destroy(&m);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值