当前位置:首页 » 《随便一记》 » 正文

Linux:线程同步_小柒的秃头之路

11 人参与  2022年03月12日 15:07  分类 : 《随便一记》  评论

点击全文阅读


1.线程:进程内部的一条执行路径(序列),调度的基本单位
进程: 一个正在运行的程序,动态分配基本单位
线程可以是程序可靠性降低,用线程可以利用多个处理器的资源
pv操作是原子操作
2. 创建信号量

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

void* fun(void* arg)//创建信号量
{
    char arr[]={"1 2 3 4 5 6 7"};
    char*s=strtok(arr,"");//分隔信号量
    while(s!=NULL)
    {
       printf("thread s=%s\n",s);
       sleep(1);
       s=strtok(NULL,"");
	}
}
int main()
{
    pthread_t id;
    pthread_create(&id,NULL,fun,NULL);
    
    char str[]={"a b c d e f g"};
    char *p=strtok(str,"");
    while(p!=NULL)
    {
        printf("main p=%s\n",p);
        sleep(1);
        p=strtok(NULL,"");
	}
    pthread_join(id,NULL);//线程结束
    exit(0);
}

运行结果:
在这里插入图片描述
3.(1)strtok函数不能在多线程中使用,因为它非线程安全函数,只能在单线程使用
(2)线程安全:多线程程序无论调度顺序如何,都能得到正确的一致的效果
(3)线程安全函数:
strtok 非线程安全函数
strtok_r 线程安全函数
(4)解决线程安全问题方法:同步,使用线程安全的函数
(5)非线程安全函数由什么原因导致?
在函数内部使用全局变量或静态变量
三个同时创建线程:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>

sem_t sem1,sem2,sem3;
//三个线程打印数字a,b,c
void* fun1(void* arg)
{
    int i=0;
    for(;i<5;i++)
    {
        sem_wait(&sem1);//p操作
        printf("A");
        fflush(stdout);
        sem_post(&sem2);//v操作
        sleep(1);
    }
}
void* fun2(void* arg)
{
    int i=0;
    for(;i<5;i++)
    {
        sem_wait(&sem2);//p操作
        printf("B");
        fflush(stdout);
        sem_post(&sem3);//v操作
        sleep(1);
    }
}
void* fun3(void* arg)
{
    int i=0;
    for(;i<5;i++)
    {
        sem_wait(&sem3);//p操作
        printf("C");
        fflush(stdout);
        sem_post(&sem1);//v操作
        sleep(1);
    }
}
int main()
{
    //三个信号量初始化
    sem_init(&sem1,0,1);
    sem_init(&sem2,0,0);
    sem_init(&sem3,0,0);
    
    pthread_t id1,id2,id3;
    pthread_create(&id1,NULL,fun1,NULL);
    pthread_create(&id2,NULL,fun2,NULL);
    pthread_create(&id3,NULL,fun3,NULL);
    
    //等待三个进程结束
    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
    pthread_join(id3,NULL);
    
    //销毁
    sem_destroy(&sem1);
    sem_destroy(&sem2);
    sem_destroy(&sem3);
    
    exit(0);
}

运行结果:
在这里插入图片描述
创建线程:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>

void* fun(void* arg)
{
    for(int i=0;i<5;i++)
    {
        printf("main run\n");
        sleep(1);
	}
}
int main()
{
    pthread_t id;
    pthread_create(&id,NULL,fun,NULL);
    
    for(int i=0;i<5;i++)
    {
        printf("main run\n");
        sleep(1);
	}
}

运行结果:
在这里插入图片描述
执行5次后结束

加入fork后:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>

void* fun(void* arg)
{
    for(int i=0;i<5;i++)
    {
        printf("main run pid=%d\n",getpid());
        sleep(1);
	}
}
int main()
{
    pthread_t id;
    pthread_create(&id,NULL,fun,NULL);
    
    fork();
    for(int i=0;i<5;i++)
    {
        printf("main run pid=%d\n",getpid());
        sleep(1);
	}
}

运行结果:
在这里插入图片描述子进程打印的数字只与fork位置有关


点击全文阅读


本文链接:http://www.zhangshiyu.com/post/36085.html

线程  函数  信号量  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 无弹窗全文(许轻衣陆庭深)冷战两年,她离婚他发疯全文畅享阅读
  • 完结文爱如溺海恨意难休结局+番外免费列表_完结文爱如溺海恨意难休结局+番外免费(司漾许澄意柳眠眠)
  • 三国之召唤妖孽系统大反击_刘协精选作品_小说后续在线阅读_无删减免费完结_
  • 我盼孤身纵马,四海任我游在线阅读_蔺昭魏迟连蔺昭更新_小说后续在线阅读_无删减免费完结_
  • 终章小说姜挽宁段秉谦:结局+番外(愿负光阴也负你)已更新+延伸(愿负光阴也负你)清爽版
  • 奉命吃瓜后,我的瓜田遍布全世界是什么小说(云似初叶见深)(奉命吃瓜后,我的瓜田遍布全世界)全本完整清爽版在线+无广告结局
  • (姜挽宁段秉谦)姜挽宁段秉谦小说(愿负光阴也负你)小说全集速览无广告高口碑小说
  • 重生到末日高温前,被污蔑成荡妇的我自请下堂后续+完结_陈风婆婆林溪超长版_小说后续在线阅读_无删减免费完结_
  • 人家拿命下副本,你却用假身逃课?无错版_陈林连载_小说后续在线阅读_无删减免费完结_
  • 完结文犹若清风梦了云宝藏列表_完结文犹若清风梦了云宝藏(晏临渊叶知薇)
  • 儿子来自六年后:结局+番外免费品鉴:结局+番外评价五颗星
  • 完结文开挂辅助成团宠,全星际争当大冤种!结局+番外高口碑列表_完结文开挂辅助成团宠,全星际争当大冤种!结局+番外高口碑(白希薇)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1