Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2012, 16:45   #1
Watch0ut
Новичок
Джуниор
 
Регистрация: 14.12.2012
Сообщений: 1
По умолчанию Mutax

Добрый день,
Я разбираюсь с мьютаксами, и не могу понять в чем проблема в моей программе. Задача - создать связный список из четных и нечетных чисел в 2 потока, числа должны идти по порядку. Если просто выводить в консоль через cout << " " << j; , работает как надо... а при использовании списка не получается. Если добавить задержку после ReleaseMutex получается более менее упорядочено, но все равно не так. Подскажите в чем проблема и как это исправить используя только мьютаксы?

Код:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>


using namespace std;

HANDLE tw,tr;
HANDLE Mutex;

unsigned long tw_id, tr_id;

struct ListItem {  
	int value; // данные
	ListItem *next; // указатель на следующий элемент структуры

	ListItem (int i, ListItem *n = NULL) // конструктор структуры, по умолчанию n = Null
		{
		 value = i;
		 next = n;
		}
				};

	ListItem *first; // указатель на первый элемент списка
	ListItem *last; // указатель на последний элемент списка
	ListItem *p;

	void AddNode(int value) {

  ListItem *p = new  ListItem (value);
  p->value=value;
  if (first == NULL) 
  {
    p->next = NULL;
    first = p;
    last = p;
  }
  else
  {
    p->next = NULL;
    last->next = p;
    last = p;
  }
	                   }

	void PrintList()
	{
	  p = first;
	  while (p != NULL) 
		{
			cout << " " << p->value;
			p =p->next;
		}
  	}




void thread1(){
	
	int j;
	for (int i =0; i<50;i++)
	{
		WaitForSingleObject(Mutex,INFINITE);

			
		j = 2*i;
		AddNode(j);
		//cout << " " << j;
	    ReleaseMutex( Mutex );
		//Sleep(10);
	}
			}

void thread2(){

	int j;
	for (int i =0; i<50;i++)
	{
		WaitForSingleObject(Mutex, INFINITE);
		j = 2*i+1;
	    AddNode(j);
	//   cout << " " << j;
		ReleaseMutex(Mutex);
	//	Sleep(10);
		
}
	
}
int main( void )
{ 
	Mutex = CreateMutex (NULL , FALSE, NULL);
	tw=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread1,NULL,0,&tw_id);
	tr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread2,NULL,0,&tr_id);
	
	Sleep(1000);

	PrintList();
	cin.get();
return 0;
}
Watch0ut вне форума Ответить с цитированием
Старый 16.12.2012, 00:08   #2
Lasor
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Watch0ut Посмотреть сообщение
Добрый день,
Я разбираюсь с мьютаксами, и не могу понять в чем проблема в моей программе. Задача - создать связный список из четных и нечетных чисел в 2 потока, числа должны идти по порядку. Если просто выводить в консоль через cout << " " << j; , работает как надо... а при использовании списка не получается. Если добавить задержку после ReleaseMutex получается более менее упорядочено, но все равно не так. Подскажите в чем проблема и как это исправить используя только мьютаксы?

Код:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>


using namespace std;

HANDLE tw,tr;
HANDLE Mutex;

unsigned long tw_id, tr_id;

struct ListItem {  
	int value; // данные
	ListItem *next; // указатель на следующий элемент структуры

	ListItem (int i, ListItem *n = NULL) // конструктор структуры, по умолчанию n = Null
		{
		 value = i;
		 next = n;
		}
				};

	ListItem *first; // указатель на первый элемент списка
	ListItem *last; // указатель на последний элемент списка
	ListItem *p;

	void AddNode(int value) {

  ListItem *p = new  ListItem (value);
  p->value=value;
  if (first == NULL) 
  {
    p->next = NULL;
    first = p;
    last = p;
  }
  else
  {
    p->next = NULL;
    last->next = p;
    last = p;
  }
	                   }

	void PrintList()
	{
	  p = first;
	  while (p != NULL) 
		{
			cout << " " << p->value;
			p =p->next;
		}
  	}




void thread1(){
	
	int j;
	for (int i =0; i<50;i++)
	{
		WaitForSingleObject(Mutex,INFINITE);

			
		j = 2*i;
		AddNode(j);
		//cout << " " << j;
	    ReleaseMutex( Mutex );
		//Sleep(10);
	}
			}

void thread2(){

	int j;
	for (int i =0; i<50;i++)
	{
		WaitForSingleObject(Mutex, INFINITE);
		j = 2*i+1;
	    AddNode(j);
	//   cout << " " << j;
		ReleaseMutex(Mutex);
	//	Sleep(10);
		
}
	
}
int main( void )
{ 
	Mutex = CreateMutex (NULL , FALSE, NULL);
	tw=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread1,NULL,0,&tw_id);
	tr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread2,NULL,0,&tr_id);
	
	Sleep(1000);

	PrintList();
	cin.get();
return 0;
}
Делай mutex.lock/mutex.unlock. После unlock делай usleep(1) - отпускай поток. Не отпустив его ты не даёшь другому потоку работать.
Lasor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц