6
votes

C: Exécutez deux fonctions en même temps?

J'ai deux fonctions dans C:

void function1(){
    // do something
}

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


2 commentaires

Si les threads s'exécuteront vraiment en même temps dépendent du matériel (votre matériel dispose-t-il de multiples noyaux d'exécution indépendants) et le système d'exploitation (le système d'exploitation planifie-t-il les deux threads en même temps).


"Dans le même temps" signifie normalement "apparemment en même temps"; En ce moment, j'écris ce commentaire, "Alors que" Wget télécharge quelque chose, "tandis que" ... PS répertorie 50 "choses" "choses" ... apparemment tout dans le "même temps"; Si certains peuvent aller parallèlement pour le réel ou non, cela dépend de ... Néanmoins, à peine tous ceux qui peuvent être «parallèles dans du matériel», nous pensons toujours que nous pensons toujours à la multitâche comme les choses exécutées dans «le même temps», du point de vue de l'utilisateur. , même si nous l'exécutons sur un seul processeur SingLecore. Je crois que l'Oper a voulu que ce qui est possible avec des fourchettes et des threads


3 Réponses :


10
votes

Vous utiliseriez des threads.

Par exemple, Pthreads est une bibliothèque AC pour multithreading.

Vous pouvez regarder ce Didacticiel Pthreads Pour plus de détails.

Voici un exemple d'un programme de reproduction de pthreads de ce tutoriel . < / p> xxx

sauf que (comme vous le savez probablement) "exactement le même moment" n'est pas techniquement possible. Que vous soyez sur un processus unique ou multicœur, vous êtes à la merci du planificateur du système d'exploitation pour exécuter vos threads. Il n'y a aucune garantie qu'ils vont courir "en même temps", ils peuvent plutôt partager un noyau unique. Vous pouvez commencer deux threads et les exécuter simultanément, mais cela peut ne pas être exactement ce que vous êtes après ...


10 commentaires

Il n'y a pas de lien pour le télécharger?, Est-ce inclus par défaut?


Si vous êtes sur Linux, oui, ne connaît pas beaucoup d'autre. Google a des hits pour le télécharger.


@Daniel: Vous avez peut-être déjà disponible Pthreads - cela vous aiderait si vous avez déclaré quel environnement OS et programmation vous utilisez.


C'est une bibliothèque standard Linux, bien qu'il y ait une demi-complète Win32 Port . Le filetage croisé de la plate-forme est notoirement ennuyant dans C, mais Boost a un Fil bibliothèque pour C ++


Désolé de ne pas dire cela, j'utilise Mac OS X 10.6


"Un processeur qui ne peut faire qu'une chose à la fois" ... dans quel siècle? :-) Les multi-noyaux sont maintenant à peu près la norme.


@Daniel: Oui, Mac a Pthreads. Dans un terminal, tapez homme pthread .


Obtenir une erreur: «FonctionName» non déclaré (première utilisation dans cette fonction) la fonction existe!


@SQuelart: Oui, je suis consciemment ignoré des machines multicœurs ... Cela ne confond vraiment que la question - vous êtes toujours à la merci du planificateur. Je vais modifier pour clarifier.


@Daniel: Vous allez avoir à afficher votre code pour travailler sur l'erreur. Notez également que les threads sont semés de danger, en particulier si les deux threads accèdent à des données communes.



1
votes

Pour une approximation de 'en même temps', vous pouvez exécuter chaque fonction dans son propre thread (voir https://computing.llnl.gov/tatudials/ppthreads/ pour plus d'informations)

Si vous devez vous assurer que ces deux fonctions effectuent des opérations sous une sorte de mode synchronisée, vous voudrez en savoir plus sur les primitives de synchronisation telles que les mutiles, les sémaphores et les moniteurs.


0 commentaires

5
votes

Ce n'est pas possible de faire de manière standard. Vous devrez compter sur une méthode tierce partie. Nommément, pthreads ou WIN32 threads .

EXEMPLE POSIX: P>

#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;
}


2 commentaires

3 jours à la recherche de quelque chose de simple à comprendre et finalement je vous ai trouvé. Merci de ne pas compliquer notre vie


Il y a une erreur dans la fonction principale () Win32 (): Veuillez modifier ceci: thread2 = Createthread (null, 0, print_once, "bar", 0, null); à ceci: thread2 = Créethread (null, 0, print_wice, "bar", 0, null);