Je cherche a relancer un thread après l'avoir mis sur pause(). La seul technique que j'ai trouvé c'est signal qui me force a lancer une fonction dont je n'ai pas besoin. C'est moche :s
Regardez :
void sem_remove(Semaphore* sem){
if(sem->next != NULL){
//prevent leak memory
SemaphoreQueue* buff;
buff = sem->next;
//get next thread
sem->next = sem->next->next;
//wakeup process
pthread_kill(*buff->process, SIGUSR1);
//released the node
free(buff);
//increment semaphore
atomic_fetch_add(&sem->size, sem->cost);
}else{
//no queue so just increment semaphore
atomic_fetch_add(&sem->size, sem->cost);
}
}
void* lauchInstance(void* param){
int* instanceId = (int *)param; // id of the instance
printf("Instance %d created\n", *instanceId);
if(sem_access(&mySemaphore, &myInstance[*instanceId], instanceId)){
pause();
}else{
sleep(1);
}
signal(SIGUSR1, signal_handler);
printf("Restart instance %d\n", *instanceId);
printf("Instance %d just ending\n", *instanceId);
sem_remove(&mySemaphore);
pthread_exit (0);
}
Une idée simple, le main (l'appelant, le chef d'orchestre) fait un tableau d'une structure. Autant d'éléments que de threads.
Dans cette structure évidemment toutes les paramètres pour le thread, mais aussi un bool "pause".
Tu passes un pointeur vers une de ces structures en paramètre quand tu crées le thread, le main peut modifier le champs pause d'une de ces structures s'il le souhaite, et le thread le voit.
Il s'agit d'un sémaphore avec une queue. L'exercice est de simuler un certain nombre de programme qui se lancent et accèdent a une partie protégé du code. Si la partie est bloqué ils vont dans la queue. Quand un programme se termine, il réveille celui en tête de queue.
Ce que j'ai fait est fonctionnel mais cette fonction de retour signal_handler(); (dans main) est inutile et m'énerve un peu...
Si il ni a pas d'autre moyen ca m'ira... mais j'aurai aimé pouvoir gérer plutot du genre soit
if(signal()){ code de reprise; }
(+ ou - l'équivalent mais mieux car j'ai accès aux variable... ici celle du thread lauchInstance qui me permet d'imprimer l'id de l'istance. Je n'y est pas accès dans la fonction signale_handler )
ou directement :
signal(); code de reprise
(je reprend sans ajouter aucun code comme une interuption classique processeur)
-------------------------------------------
#ifndef SEMAPHORE_H
#define SEMAPHORE_H
#include <pthread.h>
#include <stdatomic.h>
#include <stdbool.h>
typedef struct semaphoreQueue{
pthread_t* process;
struct semaphoreQueue* next;
}SemaphoreQueue;
typedef struct{
SemaphoreQueue* next;
volatile atomic_int size;
int cost;
}Semaphore;
void sem_remove(Semaphore* sem);
void sem_push(Semaphore* sem, pthread_t *thread);
void sem_init(Semaphore* sem, int initSize, int initCost);
bool sem_access(Semaphore* sem, pthread_t *thread, int* instanceId);
#endif // SEMAPHORE_H
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
"Etre vrai, peu le peuvent."
Friedrich Nietzsche
git is great because Linus did it, mercurial is better because he didn't.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
"Etre vrai, peu le peuvent."
Friedrich Nietzsche