Пример #1
0
main()  
{
	int p,c;	
	n =10;	
	produce_semaphore = MySemaphoreInit(2); 
	consume_semaphore = MySemaphoreInit(1);
 
	MyThreadInit(temp,(void *)&n);	
	if(MySemaphoreDestroy(produce_semaphore) == -1)
		printf("\n Error destroying producer semaphore");
	if(MySemaphoreDestroy(consume_semaphore))
		printf("\nError destroying consumer semaphore");
}
void MyThreadInit(void(*start_funct)(void *), void *args)
{
start = 1;
	
	MyThread* node;
    	//printf("\nCP1");
	ready_queue = malloc(sizeof(MyThread));
	getcontext(&ready_queue->context);
 	ready_queue->context.uc_link=&controller;
 	ready_queue->context.uc_stack.ss_sp=malloc(MEM);
 	ready_queue->context.uc_stack.ss_size=MEM;
 	ready_queue->context.uc_stack.ss_flags=0;
	ready_queue->id = threadCount++;
	//printf("Allocation Initial Id: %d", ready_queue->id);

	makecontext(&ready_queue->context, (void*)start_funct, 1, (int)args);

	ucontext_t next;
	int id;	

	getcontext(&controller);

	//printf("\nAbout to Start Checking of Unblocking");
	//printQueues();
	CheckForUnblocking();
	//printf("\nChecked for Block");

	
	//printQueues();


	if(ready_queue != NULL)
	{
		
		
		if(start == 1)
		{
			next = ready_queue->context;
			id = ready_queue->id;
			//printf("\n 2 Should Repeat:");
			//printf("\n4Allocation Initial Id: %d", ready_queue->id);
			start = 0;
			//printQueues();
			setcontext(&next);
		}
		else if (ready_queue->next != NULL)
		{	
			ready_queue = ready_queue->next;
			//CheckForUnblocking();
			next = ready_queue->context;
			id = ready_queue->id;
			//printf("\n 2 Should Repeat:");
			//printf("\nSetting Context Id: %d",id);


			//printQueues();

			setcontext(&next);
		}
		else 
		{	
			//printf("1Entering New Code");
			ready_queue = NULL;
			//printf("2Entering New Code");
			//printQueues();
			CheckForUnblocking();
			//printf("1Entering New Code");
			if (ready_queue != NULL)
			{
				next = ready_queue->context;
				id = ready_queue->id;
				//printf("\n 2 Should Repeat:");
				//printf("\nSetting Context Id: %d",id);


				//printQueues();

				setcontext(&next);
			}
		}
	}
 	printf("completed\n");
 	printQueues();
 	printf("Final Queue Remains: ");
 	MySemaphoreDestroy(sem1);
 	MySemaphoreDestroy(sem2);
 	printQueues();

}