两种方法实现两个线程交替执行(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;
}
C++ 中,可以使用多种方式实现线程同步,以下是其中的几种: 1. 互斥锁(Mutex) 互斥锁是一种最常见的线程同步机制。它可以保证同时只有一个线程可以访问共享资源,其他线程需要等待该线程释放锁之后才能访问。C++ 中可以使用 `std::mutex` 类来创建互斥锁,使用 `lock()` 和 `unlock()` 函数来加锁和解锁。 ```c++ #include <iostream> #include <thread> #include <mutex> std::mutex mtx; // 创建互斥锁 void print(int num) { mtx.lock(); // 加锁 std::cout << num << std::endl; mtx.unlock(); // 解锁 } int main() { std::thread t1(print, 1); std::thread t2(print, 2); t1.join(); t2.join(); return 0; } ``` 在这个例子中,我们创建了一个互斥锁对象 `mtx`,并在 `print()` 函数中使用 `lock()` 和 `unlock()` 函数来加锁和解锁。在 `main()` 函数中,我们创建了两个线程 `t1` 和 `t2`,同时调用 `print()` 函数并传入不同的参数。由于互斥锁的存在,两个线程交替输出数字 1 和 2。 2. 条件变量(Condition Variable) 条件变量是一种线程同步机制,它可以让线程在某个条件满足时才继续执行C++ 中可以使用 `std::condition_variable` 类来创建条件变量,使用 `wait()` 函数等待条件,使用 `notify_one()` 或 `notify_all()` 函数唤醒等待的线程。 ```c++ #include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; // 创建互斥锁 std::condition_variable cv; // 创建条件变量 bool ready = false; void print(int num) { std::unique_lock<std::mutex> ulock(mtx); while (!ready) cv.wait(ulock); std::cout << num << std::endl; } int main() { std::thread t1(print, 1); std::thread t2(print, 2); std::this_thread::sleep_for(std::chrono::seconds(1)); { std::lock_guard<std::mutex> guard(mtx); ready = true; } cv.notify_all(); t1.join(); t2.join(); return 0; } ``` 在这个例子中,我们创建了一个互斥锁对象 `mtx` 和一个条件变量对象 `cv`,并在 `print()` 函数中使用了 `wait()` 函数等待条件。在 `main()` 函数中,我们创建了两个线程 `t1` 和 `t2`,并在一秒钟后唤醒两个线程。由于条件变量的存在,两个线程会等待条件满足后才会输出数字 1 和 2。 以上是两种常见的 C++ 线程同步机制,当然还有其他的同步机制,如信号量、屏障等。不同的同步机制适用于不同的场景,需要根据实际情况选择合适的机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值