给线程一个顺序(及线程的同步)

时间:2021-07-20
本文章向大家介绍给线程一个顺序(及线程的同步),主要包括给线程一个顺序(及线程的同步)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

信号量(线程同步)
头文件
#include <semaphore.h>
信号量的初始化:
int sem_init(sem_t *sem, int pshared, unsigned int value);
return: 0成功 -1失败
sem_t *sem: 要初始化的信号量
int pshared: 0表示线程间 1表示进程
unsigned int value: 初始化信号的资源数
p操作:
sem_wait
申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1 ,程序继续执行
v操作:
sem_post
V操作:释放资源,对应资源+1

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

/*
按顺序输出我是1我是2不会乱序。
*/


sem_t rt, dt;//定义两个信号量


void *fun_1(void *arg)//线程1
{
    char *p = (char *)arg;
    while(1)
    {
        //申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1,程序继续执行
        sem_wait(&rt);

        puts(p);
        sleep(1);

        //释放资源,对应资源+1
        sem_post(&dt);
    } 
}


void *fun_2(void *arg)//线程2
{
    char *p = (char *)arg;
    while(1){
        //申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1,程序继续执行
        sem_wait(&dt);

        puts(p);
        sleep(1);

        //释放资源,对应资源+1
        sem_post(&rt);
    }
}

int main()//main函数内为主线程,主线程在运行子线程才能正常运行。
{
    pthread_t tid_1;
    pthread_t tid_2;
    if(0 != pthread_create(&tid_1, NULL, fun_1, "I am one!")){
        perror("pthread_create1");
        return -1;
    }
    if(0 != pthread_create(&tid_2, NULL, fun_2, "I am two!")){
        perror("pthread_create1");
        return -1;
    }


    //初始化信号量
    if(0 != sem_init(&rt, 0, 1))//给rt分配1个资源
    {
        perror("sem_init");
        return -1;
    }
    if(0 != sem_init(&dt, 0, 0))//给dt分配0个资源
    {
        perror("sem_init");
        return -1;
    }



    while(1)
    {
            sleep(3);
    }

}

注意:多线程程序在编译的时候需要链接对应的库-lpthread

原文地址:https://www.cnblogs.com/JinShanCheShen/p/15036337.html