POSIX Threads
POSIX Threads
Bibliotheken: pthread libraries
libthread.so
kompilieren: gcc -lpthread -o myProgram myProgram.c
POSIX Threads API
pthread_t
pthread_creat(pthread_t *thread, const pthread_attr_t *attr, void* (*start_routine)(void*), void *arg)
/*
attr: Eigenschaften
start_routine: Hauptfunktion. Argument => Ergebnis
arg: Pointer
*/
pthread_join(pthread_t thread, void**retval)
/*
wartet, bis der Threada fertig ist
retval-Pointer zur Variable, in der das Ergebnis des Threads gespeichert werden soll. NULL=> Ergebnis nicht gespeichert werden.
*/
Beispiel
#include <studio.h>
#include <pthread.h>
void *print_char(void *ch)
{
int i;
for (i=0;i<10;i++)
printf("%c"), *(char*) ch);
return NULL;
}
int main(){
char ch='-';
pthread_t p;
pthread_create(&p, NULL, print_char, &ch);
pthread_join(p, NULL);
printf("\n");
return 0;
}
Mutexe und Semaphone互斥量和信号量
Beispiel: Inselzugang
岛上停车场,容量1000,存在进出感应器和一个信号灯
enum Farbe (ROT, GRUEN);
void set_ample(enum Farbe neue_farbe);
int anzahl_autos;
void *sensor_in, *sensor_out;
int main(){
pthread_t thread_in, thread_out;
pthread_create(&thread_in, NULL, void*(*)(void*) check_eingang, NULL);
pthread_create(&thread_out, NULL, void*(*)(void*) check_ausgang, NULL);
pthread_join(thread_in, NULL);
pthread_join(thread_out, NULL);
}
void check_eingang(){
while (true){
await_sensor(sensor_in);
anzahl_autos += 1;
if (anzahl_autos >= 1000){
set_ample(ROT);
}
}
}
void check_ausgang(){
while (true){
await_sensor(sensor_out);
anzahl_autos -= 1;
if (anzahl_autos < 1000){
set_ample(GRUEN);
}
}
}
Mutexe
kritische Abschnitte schützen
pthread_mutex_t
pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t* attr)
pthread_mutex_lock(pthread_mutex_t *mutex)//blockieren
pthread_mutex_unlock(pthread_mutex_t *mutex)//freigeben
pthread_mutex_t ample_lock;
void check_ausgang(){
while (true){
await_sensor(sensor_out);
pthread_mutex_lock(&el_lock);
anzahl_autos -= 1;
if (anzahl_autos < 1000){
set_ample(GRUEN);
}
pthread_mutex_unlock(&el_lock);
}
}
Semaphore
sem_t
sem_init(sem_t *sem, int pshared, unsigned int value)
sem_wait(sem_t *sem)
sem_post(sem_t *sem)