主线程和子线程分别循环一定次数

运用到了互斥量和条件变量,分别在主进程和子进程中循环。


子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码。


编译的时候遇到两个问题:

1.C语言中不支持bool类型,所以需要自定义bool为int

2.for语言中,不支持for(int i=..),不然会报一个'for' loop initial declarations are only allowed in C99 mode错误。


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define bool int
#define true 1
#define false 0

pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int i = 0;
int main_count=0;
int subtread_count=0;
bool main_thread_wait_flag = false;//线程等待标志
bool subthread_wait_flag = false;


void main_thread_func()
{
	while(true)
	{
		pthread_mutex_lock(&mylock);
		main_thread_wait_flag =  true;
		pthread_cond_wait(&cond,&mylock);
		main_thread_wait_flag = false;
		pthread_mutex_unlock(&mylock);

		for(i=1;i<=100;i++)
		{
			printf("main thread: %d\n",i);
		}

		while(true)
		{
			pthread_mutex_lock(&mylock);
			if(true == subthread_wait_flag)
			{
				pthread_cond_signal(&cond);
				pthread_mutex_unlock(&mylock);
				break;
			}
			pthread_mutex_unlock(&mylock);
		}

		++main_count;
		if(main_count >= 50)
		{
			printf("main thread loop over 50 times\n");
			break;
		}

	}
}

void *subthread_func(void *arg)
{
	while(true)
	{
		for(i=1;i<=10;i++)
		{
			printf("subthread: %d\n",i);
		}

		while(true)
		{
			pthread_mutex_lock(&mylock);
			if(true == main_thread_wait_flag)
			{
				pthread_cond_signal(&cond);
				pthread_mutex_unlock(&mylock);
				break;
			}
			pthread_mutex_unlock(&mylock);
		}
		
		pthread_mutex_lock(&mylock);
		subthread_wait_flag = true;
		pthread_cond_wait(&cond,&mylock);
		subthread_wait_flag = false;
		pthread_mutex_unlock(&mylock);

		++subtread_count;
		if(subtread_count >= 50)
		{
			printf("subthread loop over 50 times\n");
			break;
		}
	}
	return (void *)0;
}

int main()
{
	pthread_t tid;

	pthread_create(&tid,NULL,subthread_func,NULL);
	main_thread_func();
	pthread_join(tid,NULL);

	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值