本文实现两个线程交替打印,采用的是逐步添加代码,分析每一步代码的作用,若想要看最终版本可直接翻看后面的最终版本。(本文以信号量为例,互斥锁的实现只需将信号量的函数换成相应的互斥锁的函数,互斥锁(信号量)函数不知道的看https://blog.csdn.net/liqiao_418/article/details/83684347)
首先实现两个线程的打印,不加入信号量的应用,代码如下:(注:以下执行结果均是多核环境下的执行结果)
代码说明:在主线程里创建一个函数线程,主线程和函数线程中各写一个循环分别打印。主线程打印完调用函数pthread_join()用来等待函数线程的完成,等函数线程完成后再结束进程(否则可能主线程完成任务后,函数线程还没开始执行,主线程就结束了进程)。
此时运行结果如下:
接下来加入信号量的函数,实现两个线程的交替打印,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<semaphore.h>
#include<pthread.h>
sem_t sem;//定义全局变量
void* fun(void* arg)
{
printf("fun thread start\n");
int i=0;
for(;i<5;i++)
{
sem_wait(&sem);//相当于P操作
sleep(1);//只是表示循环内部需要执行时间的长短(假设循环内有很多内容,需要执行1s)
printf("fun thread running\n");
sem_post(&sem);//相当于V操作
}
printf("fun thread end\n");
return NULL;
}
int main()
{
pthread_t id;
int res=pthread_create(&id,NULL,fun,NULL);//创建线程
assert(res==0);//断言线程创建成功
int n=sem_init(&sem,0,1);//对信号量进行初始化
assert(n==0);//断言信号量初始化成功
printf("main thread start\n&