Ich habe eine Klasse Threadpool erstellt und leer Funktion execute_thread_helper()
genannt, die innerhalb void* execute_thread(void* arg)
(seine Funktion gegeben hat auf das Thema auf diese Weise: ret = pthread_create(&workers[i], NULL, execute_thread, (void*)this);
) genannt wirdpthread_cond_wait und pthread_mutex_lock funktioniert nicht wie erwartet
void ThreadPool::execute_thread_helper()
{
Task task;
pthread_mutex_lock(&mutex);
while(TaskList.empty()) // Previously "if"
{
cout << "Thread #" << pthread_self() << " is blocked. "<< endl;
pthread_cond_wait(&conditionVar, &mutex);
}
task = TaskList.front();
TaskList.pop();
cout << "Thread #" << pthread_self() << " going to run the function. "<< endl;
threadFunction(task);
pthread_mutex_unlock(&mutex);
}
Aufgaben sind auf diese Weise zu einer Warteschlange von Aufgaben hinzugefügt -
void ThreadPool::add_task(Task newTask)
{
pthread_mutex_lock(&mutex);
TaskList.push(newTask);
pthread_cond_signal(&conditionVar);
pthread_mutex_unlock(&mutex);
}
Soweit ich verstehe, sobald ein Thread erstellt werden - es wird versuchen execute_thread
zu laufen. Und dann, bei einer leeren Warteschlange, erwarte ich pthread_cond_wait
"put" den Thread in den Ruhezustand (und tun Sie es mit allen erstellten Threads), bis es durch pthread_cond_signal
in add_task
aufwachen wird.
Well..i versucht, das Programm auf einem einzigen Thread Prüfung und bekam dieses Ergebnis (i add_task
havent gerade versucht, den Pool zu erstellen.) -
Thread #139859560904448 is blocked.
Thread #139859560904448 going to run the function.
in map() key is and value is 0
Ich verstehe nicht, wie der Thread übergeben die if-Anweisung, wenn sie zuvor in der Warteschleife war.
Ausgang auf den Versuch 3 Thread-Pool zu erstellen -
Thread #140013458028288 is blocked.
Thread #140013458028288 going to run the function.
in map() key is and value is 0
Thread #140013458028288 going to run the function.
in map() key is and value is 0
Thread #140013458028288 going to run the function.
in map() key is and value is 0
Warum nicht die anderen 2 Fäden auf Eis gelegt?
EDIT
Dank Sergeya, tat das, wenn mit Weile Schalt Hilfe. Aber dennoch versuchen 3-Thread-Pool, führt dies zu machen -
Thread #139916558706432 is blocked.
Thread #139916558706432 is blocked.
Thread #139916558706432 is blocked.
Thread #139916558706432 is blocked.
Thread #139916558706432 is blocked.
Thread #139916558706432 is blocked.
Thread #139916558706432 is blocked.
Thread #139916558706432 is blocked.
Warum keine anderen Threads erstellt werden? sollen sie nicht alle gleichzeitig erstellt werden und abwechselnd drucken, dass sie blockiert sind?
'pthread_mutex_lock (& mutex); // mutex lock' - warum nicht 'pthread_mutex_lock (& mutex); // pthread_mutex_lock'? Würde der Code in der letzteren Form viel klarer machen, nicht wahr? – SergeyA