两个线程交替执行(C/C++)

  • 时间:
  • 来源:互联网
  • 文章标签:
  1. 信号量控制两个线程交替执行代码:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<semaphore.h>
#include<pthread.h>
#include<stdbool.h>

sem_t sem;//控制函数线程的信号量
sem_t sem1;//控制主线程的信号量

bool flag=1;//用来判断函数线程是否退出循环体,1表示没有退出循环
bool flag1=1;//用来判断主线程是否退出循环体,1表示没有退出循环

void* fun(void* arg)
{
	printf("fun thread start\n");

	int i=0;
	for(;i<5;i++)
	{
		if(flag1)//只有主线程没有退出循环体,才执行此操作
        {
		    sem_wait(&sem);//对函数线程信号量P操作
        }
		printf("fun thread running\n");
		sem_post(&sem1);//对主线程的信号量进行“V操作”
	}
	flag=0;
	sem_post(&sem1);//唤醒可能阻塞的主线程

	printf("fun thread end\n");

	return NULL;
}

 void destroy()//新增代码
{
	printf("destroy\n");
	sem_destroy(&sem);//销毁信号量
	sem_destroy(&sem1);
}

int main()
{
    atexit(destroy);//注册函数
	pthread_t id;
	int res=pthread_create(&id,NULL,fun,NULL);//创建线程
	assert(res==0);//断言创建线程成功
	
	int n=sem_init(&sem,0,0);//初始化函数线程的信号量
	assert(n==0);//断言初始化函数线程信号量成功

	n=sem_init(&sem1,0,1);//初始化主线程的信号量
	assert(n==0);//断言初始化主线程信号量成功

	printf("main thread start\n");

	int i=0;
	for(;i<8;i++)
	{
		if(flag)//只有函数线程没有退出循环体,才执行此操作
        {
		    sem_wait(&sem1);//对主线程信号量P操作
        }
		printf("main thread running\n");
		sem_post(&sem);//对函数线程的信号量进行“V操作”
	}
	flag1=0;
	sem_post(&sem);//唤醒可能阻塞的fun函数进程

	/*res=pthread_join(id,NULL);
	sem_destroy(&sem);
	sem_destroy(&sem1);*/

	printf("main thread end\n");
	}
  1. 互斥锁实现
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>

int xx=0;
pthread_mutex_t mut; //互斥锁类型
void* thread_1(void* a){
    int i =0;
	pthread_mutex_lock(&mut); //加锁,用于对共享变量操作
		i+=1;
		printf("2B我是线程1 %d次\n",i);
		Sleep(3);
		xx=0;
	pthread_mutex_unlock(&mut); //解锁
}

void* thread_2(void* a){
    int i =0;
	 pthread_mutex_lock(&mut); //加锁,用于对共享变量操作
        	i+=1;
			xx=1;
			printf("2B我是线程2 %d次\n",i);
			Sleep(3);
			xx=0;
		pthread_mutex_unlock(&mut); //解锁
}

int main(int argc,const char * argv[])
{
	pthread_mutex_init( & mut,NULL );
//线程开始的地址
    pthread_t star_location_1,star_location_2;
    int ret;
    //创建线程
    ret = pthread_create(&star_location_2, NULL, thread_2,NULL);
    if (ret == !0) {
        printf("creat_error_2");
    }

    ret = pthread_create(&star_location_1, NULL, thread_1,NULL);
    if (ret == !0) {
        printf("creat_error_1");
    }

    /*等待线程结束*/
	printf("-----");
    	//pthread_join(star_location_1, NULL);
	printf("Bye!\n");
	Sleep(10000);
	//pthread_join(star_location_2, NULL);
	//printf("-------------------------");
	//pthread_join(star_location_3, NULL);
    return 0;
}

本文链接http://www.taodudu.cc/news/show-83176.html