Passer plusieurs arguments pour filetée fonction de pthread_create
c'est ma première tentative à l'enfilage en C. je suis entrain de créer un cercle délimité de la mémoire tampon. Je sais comment créer le thread, mais tous les exemples que j'ai vu que filetés fonctions qui acceptent un paramètre void, mais malheureusement, mon travailleur de la spécification m'oblige à utiliser les trois, comme illustré ici:
void bufferRead(BoundedBuffer* buffer, char* data, int count) {
pthread_mutex_lock(&buffer->mutexBuffer);
<snip>
pthread_mutex_unlock(&buffer->mutexBuffer);
}
Voici mon pthread_create déclaration
pthread_create(&buffer.readThread, NULL, (void *)bufferRead, &readParams)
Et mon readParams struct/affectations
struct readThreadParams {
BoundedBuffer b;
char* data;
int count;
};
struct readThreadParams readParams;
readParams.b = buffer2;
readParams.data = out_array;
readParams.count = in_size;
Des conseils sur la façon d'attribuer à chacune des struct paramètres après le passage à la bufferRead fonction serait grandement apprécié.
OriginalL'auteur ChrisDevWard | 2013-04-26
Vous devez vous connecter pour publier un commentaire.
C'est parce que vous ne vraiment besoin un paramètre. Quand nous avons plus d'une valeur, comme c'est généralement le cas, nous encapsuler dans une struct. Le type de fonction que pthread_create fera appel est non-négociable. C'est un domaine où le type coulée de votre pointeur de fonction peut vous causer des ennuis.
Si c'est une variable locale principal qui n'est pas un problème. Si vous fermez la fenêtre principale, puis votre programme se termine de toute façon si la variable existe toujours alors que votre programme est en cours d'exécution.
Laissant
main
ne veut pas dire immédiate de fin de programme. Et automatique (non-tas, non statique) de la variable pour la communication inter-thread est une idée discutable, au mieux.Ok vous avez raison, il y a un petit intervalle entre la fin principale et l'exécution de sortie. Donc, il n'est pas sûr. Je suis d'accord. J'allais écrire quelque chose à propos de la façon dont, aussi longtemps que vous créez votre objet thread après la variable locale vous passez en vous garantit d'être en sécurité, mais c'est c/pthreads, pas du c++ que j'ai d'abord pensé.
L'OP code ne fait aucune mention de main(). À l'aide d'une pile locale struct comme un paramètre est très dangereux dans le cas général de la non-trivial apps.
OriginalL'auteur Daniel Santos
Fonction de démarrage doit prendre en argument. Si votre direction est droite:
Ensuite, vous avez besoin d'allouer de la variable sur le tas, pas sur pile:
Après quoi vous pouvez lui donner
createThread
:Fonction de Thread prend seulement 1 argument (void*):
OriginalL'auteur Valeri Atamaniouk
Vous avez obtenu dans le droit chemin.
Le prototype de fonction devrait être comme
Et transtypage de l'argument de type requis en fonction de thread. Ici, il convient de
Passant plus d'un argument à la fonction pthread n'est pas possible directement. donc, le plus souvent formé en tant que structure et transmis à la fonction.
Reportez-vous cette tutoriel pour plus de détails sur les pthreads.
vous pouvez transtypage et de créer. Mais pas d'utilisation. donc
void * ()(void*)
est recommandé.Non, vous ne pouvez pas. Eh bien, la seule façon d'utiliser ce prototype est d'appeler directement à partir de votre void *start_routine(void *) fonction que la bibliothèque pthread appeler, mais ce serait inutilement introduire la surcharge d'un autre appel de fonction.
Aussi, le transtypage de void* vers un autre type de pointeur n'est pas strictement nécessaire (je ne suis pas sûr de ce que C normes ce peut être requis), mais à partir d'un autre pointeur de type void* nécessite un type explicite exprimés.
Un transtypage de
void *
peuvent être convertis à un pointeur vers un objet de type, et de retour à nouveau, et la valeur doit convertir l'égalité. C'est en tous C normes, autant que je sache. Les Aspects de comportement indéfini existe si vous tentez d'accéder à l'objet vers lequel il pointe, et le pointeur n'est pas aligné correctement pour stocker ce type, ou si elle ne pointe pas vers un objet d'une taille appropriée, ou à la représentation.OriginalL'auteur Jeyaram
Cet exemple frontières sur le préprocesseur d'abus, mais je l'aime parce qu'il démontre imitant la valeur par défaut des arguments.
OriginalL'auteur autistic