C: Запускать две функции одновременно? - PullRequest
4 голосов
/ 16 июня 2010

У меня есть две функции в C:

void function1(){
    // do something
}

void function2(){
    // do something while doing that
}

Как мне запустить эти две функции в одно и то же время?Если возможно, приведите пример!

Ответы [ 3 ]

9 голосов
/ 16 июня 2010

Вы бы использовали потоки.

Например, pthreads - это библиотека ac для многопоточности.

Вы можете посмотреть в этом руководстве по pthreads для получения более подробной информации.

Вот пример программы, порождающей pthreads из этого урока .

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

За исключением того, что (как вы, вероятно, знаете) "точно в то же время" технически не являетсявозможный.Независимо от того, работаете ли вы на одноядерном или многоядерном процессе, у вас есть выбор планировщика операционной системы для запуска ваших потоков.Нет гарантии, что они будут работать «одновременно», вместо этого они могут совместно использовать одно ядро.Вы можете запустить два потока и запустить их одновременно, но это может быть не совсем то, что вам нужно ...

3 голосов
/ 16 июня 2010

Это невозможно сделать стандартным способом. Вам нужно будет положиться на какой-нибудь сторонний метод. А именно, pthreads или Win32 темы .

Пример POSIX:

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

void* print_once(void* pString)
{
    printf("%s", (char*)pString);

    return 0;
}

void* print_twice(void* pString)
{
    printf("%s", (char*)pString);
    printf("%s", (char*)pString);

    return 0;
}

int main(void)
{
    pthread_t thread1, thread2;

    // make threads
    pthread_create(&thread1, NULL, print_once, "Foo");
    pthread_create(&thread2, NULL, print_twice, "Bar");

    // wait for them to finish
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL); 

    return 0;
}

Пример Win32:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

DWORD print_once(LPVOID pString)
{
    printf("%s", (char*)pString);

    return 0;
}

DWORD print_twice(LPVOID pString)
{
    printf("%s", (char*)pString);
    printf("%s", (char*)pString);

    return 0;
}

int main(void)
{
    HANDLE thread1, thread2;

    // make threads
    thread1 = CreateThread(NULL, 0, print_once, "Foo", 0, NULL);
    thread2 = CreateThread(NULL, 0, print_once, "Bar", 0, NULL);

    // wait for them to finish
    WaitForSingleObject(thread1, INFINITE);
    WaitForSingleObject(thread2, INFINITE);

    return 0;
}

Есть порты POSIX для Windows, если вы хотите использовать его на обеих платформах.

1 голос
/ 16 июня 2010

Для приближения к «одновременно» вы могли бы выполнять каждую функцию в своем собственном потоке (см. https://computing.llnl.gov/tutorials/pthreads/ для получения дополнительной информации)

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

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