现在的位置: 首页 > 综合 > 正文

线程按顺序执行(迅雷笔试题)

2013年08月08日 ⁄ 综合 ⁄ 共 2421字 ⁄ 字号 评论关闭

编写一个程序,开启3个线程,这3个线程的ID分别为ABC,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC.依次递推。

方法1:使用信号量semaphore

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

sem_t g_sem;
int count = 0;

void *thread_fun1(void *arg)
{	
	while(1)
	{
		if(count == 10)
		{
			break;
		}
		sem_wait(&g_sem);
		printf("thread1's id is %d\n", pthread_self());	
		sem_post(&g_sem);
		sleep(1);
	}
	return (void*)0;
}

void *thread_fun2(void* arg)
{	
	while(1)
	{
	
		if(count == 10)
		{
			break;
		}
		sem_wait(&g_sem);
		printf("thread2's id is %d\n", pthread_self());
		sem_post(&g_sem);
	
		sleep(1);
	}
	return (void*)0;
}

void *thread_fun3(void *arg)
{
	while(1)
	{
		sem_wait(&g_sem);
		printf("thread3's id is %d\n\n", pthread_self());
		sem_post(&g_sem);
		if(++count == 10)
		{
			break;
		}	
		sleep(1);
	}
	return (void*) 0;
}

int main()
{
	pthread_t thread1;
	pthread_t thread2;
	pthread_t thread3;

	int res = 0;
	res = sem_init(&g_sem,0,0);
	if(res)
	{
		printf("Semaphore initilization failed\n");	
		return -1;
	}
	res = pthread_create(&thread1, NULL, thread_fun1, NULL);	
	if(res)
	{
		printf("Thread1 created failed\n");
	}	
	res = pthread_create(&thread2, NULL, thread_fun2, NULL);
	if(res)
	{
		printf("thread2 created fialed\n");
	}
	res = pthread_create(&thread3, NULL, thread_fun3, NULL);
	if(res)
	{
		printf("thread3 created failed\n");
	}	
	sem_post(&g_sem);
	pthread_join(thread1, NULL);
	pthread_join(thread2, NULL);
	pthread_join(thread3, NULL);	

}

方法2:使用互斥变量mutex

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

pthread_mutex_t  g_mutex;
int count = 0;
int num_count = 0;
void *thread_fun1(void* arg)
{	
	while(1)
	{
		if(count % 3 == 0)
		{
			pthread_mutex_lock(&g_mutex);
			count++;
			printf("thread1's id is %d\n",pthread_self()); 
			pthread_mutex_unlock(&g_mutex);
		}
		if(num_count == 10) break;
	}
	return (void*) 0;
}

void* thread_fun2(void* arg)
{
	while(1)
	{
		if(count %3 == 1)
		{
			pthread_mutex_lock(&g_mutex);
			count++;
			printf("thread2's id is %d\n",pthread_self()); 
			pthread_mutex_unlock(&g_mutex);
		}
		if(num_count == 10)  break;
	}
	return (void*) 0;
}

void* thread_fun3(void* arg)
{	
	while(1)
	{
		if(count %3 == 2)
		{
			pthread_mutex_lock(&g_mutex);		
			count++;
			printf("thread3's id is %d\n\n", pthread_self());
			num_count ++;
			pthread_mutex_unlock(&g_mutex);
		}
		if(num_count == 10) break;
		
	}
	return (void*) 0;
}

int main()
{
	pthread_t thread1, thread2, thread3;
	int res = 0;
	pthread_mutex_init(&g_mutex, NULL);
	
	res = pthread_create(&thread1, NULL, thread_fun1, NULL);
	if(res)
	{
		printf("trhead1 created failed\n");
	}
	res = pthread_create(&thread2, NULL, thread_fun2, NULL);
	if(res)
	{
		printf("thread2 created faield\n");
	}
	res = pthread_create(&thread3, NULL, thread_fun3, NULL);
	if(res)
	{
		printf("thread3 cerated failed\n");
	}

	pthread_join(thread1, NULL);
	pthread_join(thread2, NULL);
	pthread_join(thread3, NULL);		
}



抱歉!评论已关闭.