Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

В чем парадокс?

55K
14 июня 2010 года
borN_free
7 / / 17.03.2010
В дебаге если пошагово смореть, то поток из функции ResumeThread() запускает при входе на НОВУЮ итерацию цикла (wtf?).
Если SIZE = 1 то поток вторичный НЕ создается (при отсутствии функции Sleep() ), следовательно запись в файл не происходит.
Подскажите в чем дело, компилятору не хватает время запустить поток без функции Sleep() ?
Спасибо.
Код:
#include <windows.h>
#include <process.h>
#include <iostream>
#include <conio.h>
using namespace std;

HANDLE thread=NULL;
HANDLE mutex;
int M[12]= {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
FILE* f;
#define SIZE 5

struct Date {
    unsigned y; // год
    unsigned m; // месяц
    unsigned d; // день
};

struct Dates {
    int count; // количество имеющихся элементов в массиве
    Date dates[SIZE];
} dts = {0};

Date buffer,tmp;

unsigned int WINAPI ThreadFunc(void* param);
Date GetDate(Date d);
void WriteDate(char* fname, Date buf);
void SuspendThread();
void ResumeThread();


void main()
{
    dts.count =0;
   
    for (int i= 0; i< SIZE; i++)
    {
        SuspendThread();
        dts.dates[dts.count] = GetDate(tmp);
        dts.count++;
        ResumeThread();
        Sleep(100);
    }
}

void SuspendThread()
{
    thread = NULL;
}
void ResumeThread()
{
    if(thread == NULL)
    {
        thread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void*)&dts,0, NULL);
    }
    else
    {
        printf("Rabotaet!\n");
        getch();
    }
}

unsigned int WINAPI ThreadFunc(void* param)
{
    Dates* p = (Dates*)param;
    /*if ((p->count-1) == SIZE)
        return 1; // конец программы
        */
    WriteDate("f.txt", p->dates[p->count-1]);
    return 0;
}

void WriteDate(char* fname, Date buf)
{
    int i =0;
    Date rec_date;

    f= fopen(fname, "a+b");
   
    if (!f) {
        printf("Error with opening the file!");
        exit(1);
    }
   
    fwrite(&buf, sizeof(rec_date), 1, f);
    fclose(f);
}

Date GetDate(Date d)
{
    char ins_date[12];
    char* ptr;
    int args[3];
    int i = 0;
    printf("Insert date in format \"dd.mm.yyyy\"\n");
    scanf("%s", &ins_date);
    ins_date[10] = '\0';

    // разбиваем строку на подстроки
    ptr = strtok(ins_date, ".");
    args[i++] = atol(ptr);
    for (i; i<3; i++)
    {
        args = atol(strtok(NULL,"."));
    }
    d.d = args[0];
    d.m = args[1];
    d.y = args[2];

    return d;
}
14
15 июня 2010 года
Phodopus
3.3K / / 19.06.2008
Научитесь основам отладки многопоточных приложений и не путанно излагать свои мысли. Переформулируйте вопрос. Компилятор понятия не имеет о потоках. Есть понятие "завершение процесса".
ПыСы. Код SuspendThread() убил :D
5
16 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Phodopus
Научитесь основам отладки многопоточных приложений

А что это за основы, ну чисто из интереса?

252
16 июня 2010 года
koderAlex
1.4K / / 07.09.2005
а вы попробуйте представить как происходит выполнение вашей программы с точки зрения операционной системы .
5
17 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: koderAlex
а вы попробуйте представить как происходит выполнение вашей программы с точки зрения операционной системы .

Хм, и как это может помочь? С т.з. ОС мой процесс ничем не отличается от любого другого ибо планировщик работает с потоками (т.н. "мультипрограммная смесь").

252
17 июня 2010 года
koderAlex
1.4K / / 07.09.2005
планировщику требуется процессорное время на запуск вторичного потока . если запрос не блокирующий , то планировщик оставляет его на "потом" (отложенное выполнение) . со всеми вытекающими )
5
17 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: koderAlex
планировщику требуется процессорное время на запуск вторичного потока . если запрос не блокирующий , то планировщик оставляет его на "потом" (отложенное выполнение) . со всеми вытекающими )

Запуск потоков - сравнительно редкая операция, а нормальные люди как правило пользуются пулом нитей, в котором они уже готовы.

Вот я и спрашиваю, что за основы отладки многопоточных приложений?

11
17 июня 2010 года
oxotnik333
2.9K / / 03.08.2007
Цитата: hardcase

Вот я и спрашиваю, что за основы отладки многопоточных приложений?


Думаю, имелось ввиду логирование.

5
17 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: oxotnik333
Думаю, имелось ввиду логирование.


Мэй би. Просто у меня обычно один способ - способ отладки пристальным взглядом.

11
17 июня 2010 года
oxotnik333
2.9K / / 03.08.2007
Цитата: hardcase
Мэй би. Просто у меня обычно один способ - способ отладки пристальным взглядом.


Смотреть на код не мигая, как удав на кролика, в результате чего, код начинает нервничать, дрожать и от вибрации отваливается все, что плохо закреплено (баги).

55K
18 июня 2010 года
borN_free
7 / / 17.03.2010
Цитата: Phodopus
Научитесь основам отладки многопоточных приложений и не путанно излагать свои мысли. Переформулируйте вопрос. Компилятор понятия не имеет о потоках. Есть понятие "завершение процесса".
ПыСы. Код SuspendThread() убил :D



А что в вопросе не понятно? Переформулировал: почему без Sleep() не работает программа?

55K
18 июня 2010 года
borN_free
7 / / 17.03.2010
Цитата: koderAlex
а вы попробуйте представить как происходит выполнение вашей программы с точки зрения операционной системы .



Не знаю, поэтому спрашиваю. Вопрос вызвал интерес и мне хочется услышать грамотный ответ. Спасибо

3
18 июня 2010 года
Green
4.8K / / 20.01.2000
Цитата: borN_free
А что в вопросе не понятно? Переформулировал: почему без Sleep() не работает программа?


Ты же уже ответил сам на свой вопрос ещё в топике. Да, процесс создания треда и процесс создания файла - небыстрые. Без Sleep не успевают.
Именно по этому "ResumeThread() запускает при входе на НОВУЮ итерацию цикла (wtf?)"

А вообще вместо Sleep надо использовать потоковую синхронизацию.

14
18 июня 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: hardcase
А что это за основы, ну чисто из интереса?


Слишком много букав :). Ну я всего-лишь-навсего говорил о чем-то таком. Применительно к той конкретной среде на которой работает программист (конкретному дебаггеру). Потому что если человек не понимает когда именно создается поток и когда потоки передают процессор друг другу (а это похоже тот случай) - ему необходимо понимать как такое отлаживать. Иначе будут вопросы подобные "а почему цикл шел-шел, а затем вдруг начал выполняться сначала, хотя никакого continue там нет" (вымышленно). Или (что более часто) - почему под дебаггером одно, а без дебаггера - второе. Ведь как организовывать параллельные треды, когда трейсится какой-то один из них, каждый отладчик может решать по своему.

350
18 июня 2010 года
cheburator
589 / / 01.06.2006
Эээ... на будущее... Кто там говорил про отладку многопоточных приложений.
Старайтесь делать это удалённой отладкой, на двух компах, т. к. в виндах иногда GDI подвисает, всё начинает тормозить, включая отладчик. Особенности сочетания "винда + MSVC".
5.4K
21 июня 2010 года
cursor
114 / / 05.01.2008
borN_free, ответ о потоках в книге рихтера программирование для профессионалов что ли
55K
04 июля 2010 года
borN_free
7 / / 17.03.2010
Всем спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог