Ich schrieb ein Programm schrieb und es funktioniert nicht so, wie ich es erwarte. Ich habe zwei Themen: thread
löst func
und anotherThread
auslöst anotherFunc
. Was ich tun wollte, ist, wenn cont
Wert erreicht 10
in func
, anotherThread
ausgelöst werden mit pthread_cond_wait
und pthread_cond_signal
. Das seltsame Ding ist alles funktioniert gut, wenn ich die sleep(1)
Linie auskommentiere. Ich bin neu in Threads und ich folgte dem Tutorial here und wenn ich die sleep
Zeile in ihrem Beispiel kommentieren, bricht es auch.POSIX C-Gewinde. pthread_cond_t Beispiel. Funktioniert nicht wie erwartet
Meine Frage ist, wie kann ich das ohne sleep()
Anrufe tätigen? Und was passiert, wenn in meinem Code sowohl func
pthread_mutex_lock
nach anotherFunc
erreicht? Wie kann ich diese Dinge kontrollieren? Dies ist mein Code:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t myMutex;
pthread_cond_t cond;
pthread_attr_t attr;
int cont;
void *func(void*)
{
printf("func\n");
for(int i = 0; i < 20; i++)
{
pthread_mutex_lock(&myMutex);
cont++;
printf("%d\n", cont);
if(cont == 10)
{
printf("signal:\n");
pthread_cond_signal(&cond);
// sleep(1);
}
pthread_mutex_unlock(&myMutex);
}
printf("Done func\n");
pthread_exit(NULL);
}
void *anotherFunc(void*)
{
printf("anotherFunc\n");
pthread_mutex_lock(&myMutex);
printf("waiting...\n");
pthread_cond_wait(&cond, &myMutex);
cont += 10;
printf("slot\n");
pthread_mutex_unlock(&myMutex);
printf("mutex unlocked anotherFunc\n");
printf("Done anotherFunc\n");
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t thread;
pthread_t anotherThread;
pthread_attr_init(&attr);
pthread_mutex_init(&myMutex, NULL);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_cond_init(&cond, NULL);
pthread_create(&anotherThread, &attr, anotherFunc, NULL);
pthread_create(&thread, &attr, func, NULL);
pthread_join(thread, NULL);
pthread_join(anotherThread, NULL);
printf("Done MAIN()");
pthread_mutex_destroy(&myMutex);
pthread_cond_destroy(&cond);
pthread_attr_destroy(&attr);
pthread_exit(NULL);
return 0;
}
Sorry für den langen Post, aber ich bin neu in Threads und ich bin bereit zu lernen. Kennen Sie auch einige gute Referenzen oder Kurse/Tutorials zu Themen und Netzwerken unter Linux? Ich möchte lernen, einen Chat-Client zu erstellen, und ich habe gehört, dass ich dafür Threads und Networking kennen muss. Problem ist, ich weiß nicht, ziemlich gut, wenn das, was ich lerne, in Ordnung ist, da ich nicht weiß, was ich wissen muss.
Vielen Dank :)
Andere Bemerkungen. Zusätzlich zu "pthread_attr_t" müssen Sie statische Initialisierer für die Bedingung und Mutex verwenden, um den Code zu vereinfachen. Darüber hinaus können Ihre Thread-Funktionen einfach "NULL zurückgeben" oder "return 0;" anstelle von "pthread_exit" aufrufen. Und Ihr Hauptthread kann einfach "0;" aus main zurückgeben, ohne 'pthread_exit' aufzurufen. Die anderen Threads werden an diesem Punkt nicht ausgeführt, seit sie verbunden wurden. Rückgabe von Haupttruppen ein Prozess-Exit, aber 'pthread_exit' im primären Thread erzwingt keinen Prozess-Exit, was nützlich ist, um andere Threads laufen zu lassen. – Kaz
Außerdem müssen statische Mutexe und Bedingungen nicht bereinigt werden. Verwenden Sie einfach 'pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;'. Die komplexen Initialisierungen werden für Situationen benötigt, in denen Sie ungewöhnliche Attribute festlegen möchten. Z.B. Mache einen robusten Mutex mit geteiltem Prozess. – Kaz