Создание новой темы (C, Windows) - PullRequest
4 голосов
/ 21 сентября 2009

ОК, я немного запутался здесь. Работает следующий код:

HANDLE CreateSideThread()
{
    DWORD dwGenericThread;
    HANDLE hThread1 = CreateThread(NULL, 0, CallBackFunc, NULL, 0, &dwGenericThread);

    return hThread1;
}

int main()
{
    HANDLE Thread1;

    Thread1 = CreateSideThread();
    WaitForSingleObject(hThread1, INFINITE);

    SomeOtherFunction();

    return 0;
}

Программа делает другие вещи, но вы поняли идею. Он в основном создает новый поток и выполняет все, что есть в CallBackFunc (это бесконечный цикл, который проверяет состояние БД). Теперь, если я удаляю WaitForSingleObject (), тогда программа даже не будет пытаться один раз вызвать CallBackFunc и выполнить SomeOtherFunction (). Какой смысл тогда нить? Я имею в виду, я запутался здесь.

То, что я пытаюсь сделать, это вызвать этот поток с проверкой состояния базы данных и поддерживать этот поток, пока я продолжаю свою программу, вызывая другие функции.

Что я делаю не так? Пожалуйста, отправьте образец фрагмента.

Спасибо

Ответы [ 4 ]

6 голосов
/ 21 сентября 2009

Без WaitForSingleObject ваш вызов SomeOtherFunction(), вероятно, возвращается достаточно быстро, чтобы программа могла выйти до того, как новый поток даже получит возможность запустить один раз.

Когда программа на C возвращается из своей функции main(), система времени выполнения вызывает для вас exit(). Это принудительно завершает вашу программу, даже если другие потоки пытаются запускаться одновременно. Это отличается от других языков, таких как, например, Java, где выход из основного потока не завершит процесс до тех пор, пока все другие (не демонные) потоки также не завершат свою работу.

1 голос
/ 21 сентября 2009

Вы обнаружите, что основной поток завершает работу до того, как вы заметите, что CallbackFunc вызывается. Когда вы выполняете вызов Wait, основной поток блокируется до тех пор, пока новый поток не завершится, и вы увидите, что функция потока выполняется.

Потоки не так дешевы, как вы думаете, если вы замените SomeOtherFunction чем-то, что требует много времени для запуска, вы увидите, что функция вашего потока вызывается даже без вызова Wait.

1 голос
/ 21 сентября 2009

Потоки обычно используются для выполнения фоновой работы и освобождения вызывающего потока для выполнения других задач.

Обычно поведение, которое вы описываете (вызывая SomeOtherFunction ()), именно то, что вам нужно: я собираюсь справиться с фоновой «работой» и продолжить свою жизнь.

Может показаться, что с вашим примером все в порядке - хотя если вы просто вернетесь из main (), ваш поток, конечно, прекратит работу (так как он принадлежит родительскому процессу).

Может быть, более подробно, почему то, что вы делаете, не то, что вы ожидаете?

0 голосов
/ 21 сентября 2009

CallBackFunc, конечно, будет вызываться, но нет никакой гарантии, когда ваши просматриваемые потоки будут запущены. Они будут работать один раз, но это непредсказуемо, когда начнут это делать. Это работа и свойство системного планировщика. В вашем случае они ничего не делают, когда вторая функция уже вызвана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...