Linux系统编程——线程创建等待及退出2

参考博文:
https


实现如下:

.线程同步之互斥量加锁解锁和互斥锁限制共享资源的访问

案例:

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

int g_data=0;
pthread_mutex_t mutex;
void *func1(void *arg)
{
        printf("t1:%ld thread is creat\n",(unsigned long)pthread_self());
        printf("t1:parm is %d\n",*((int *)arg));
        pthread_mutex_lock(&mutex);

        while(1){
                printf("t1:%d\n",g_data++);
                sleep(1);

                if(g_data==3){
                pthread_mutex_unlock(&mutex);
                printf("==============================================\n");                     pthread_exit(NULL);
                }
        }
}
void *func2(void *arg)
{

        printf("t2:%ld thread is creat\n",(unsigned long)pthread_self());
        printf("t2:parm is %d\n",*((int *)arg));
        while(1){
                printf("t2:%d\n",g_data);
                pthread_mutex_lock(&mutex);
                g_data++;
                pthread_mutex_unlock(&mutex);
                sleep(1);
        }
}


int main()
{
        int ret;
        int ret2;
        int param=100;
        pthread_t t1;
        pthread_t t2;

        pthread_mutex_init(&mutex,NULL);

        ret=pthread_create(&t1,NULL,func1,(void *)&param);
        if(ret == 0){
                printf("main:creat t1 success\n");
        }
        ret2=pthread_create(&t2,NULL,func2,(void *)&param);
        if(ret == 0){
                printf("main:creat t2 success\n");
                        }

        while(1){
                printf("main:%d\n",g_data);
                sleep(1);
        }

        pthread_join(t1,NULL);
        pthread_join(t2,NULL);

        pthread_mutex_destroy(&mutex);

        return 0;
}
CLC@Embed_Learn:~/lianxi4$ vi demo15.c
CLC@Embed_Learn:~/lianxi4$ ./a.out
main:creat t1 success
main:creat t2 success
main:0
t1:140103516976896 thread is creat
t1:parm is 100
t1:0
t2:140103508584192 thread is creat
t2:parm is 100
t2:1
t1:1
main:2
t1:2
main:3
==============================================
main:3
t2:4
main:4
t2:5
main:5

保证g_data=3时,线程t1退出

死锁:

参考博文:https://blog.csdn.net/weixin_37931378/article/details/88716417?

线程条件控制实现线程的同步

参考博文:
https://blog.csdn.net/FHNCSDN/article/details/108866753?
案例:
代码

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

int g_data=0;

pthread_mutex_t mutex;
pthread_cond_t cond;
void *func1(void *arg)
{
        printf("t1:%ld thread is creat\n",(unsigned long)pthread_self());
        printf("t1:parm is %d\n",*((int *)arg));
        static int cnt=0;

        while(1){
                pthread_cond_wait(&cond,&mutex);
                printf("t1:run================\n");

                printf("t1:%d\n",g_data);

                g_data=0;
                sleep(1);

                if(cnt++ == 10){
                        exit(1);
                }
        }
}
void *func2(void *arg)
{

        printf("t2:%ld thread is creat\n",(unsigned long)pthread_self());
        printf("t2:parm is %d\n",*((int *)arg));
        while(1){
                printf("t2:%d\n",g_data);
                pthread_mutex_lock(&mutex);
                g_data++;
                if(g_data==3){

                        pthread_cond_signal(&cond);
                }
                pthread_mutex_unlock(&mutex);
                sleep(1);
        }
}


int main()
{
        int ret;
        int ret2;
        int param=100;
        pthread_t t1;
        pthread_t t2;
                pthread_mutex_init(&mutex,NULL);
        pthread_cond_init(&cond,NULL);

        ret=pthread_create(&t1,NULL,func1,(void *)&param);
//      if(ret == 0){
//              printf("main:creat t1 success\n");
//      }
        ret2=pthread_create(&t2,NULL,func2,(void *)&param);
//      if(ret == 0){
//              printf("main:creat t2 success\n");
//      }

        pthread_join(t1,NULL);
        pthread_join(t2,NULL);

        pthread_mutex_destroy(&mutex);
        pthread_cond_destroy(&cond);

        return 0;
}

运行结果:

CLC@Embed_Learn:~/lianxi4$ ./demo16 
t1:139871513495296 thread is creat
t1:parm is 100
t2:139871505102592 thread is creat
t2:parm is 100
t2:0
t2:1
t2:2
t1:run================
t1:3
t2:0
t2:1
t2:2
t1:run================
t1:3

测试文件test.c

int main(int argc,char **argv)
{
        int time=atoi(argv[1]);
        int i=0;

        for(i=0;i<time;i++){
                system("./demo16");
        }


}
~    

执行命令:

CLC@Embed_Learn:~/lianxi4$ ./a.out 10 >>test.ret.txt &
[3] 4230

结束之后可以打开查看运行调试结果:

CLC@Embed_Learn:~/lianxi4$ vi test.ret.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值