1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 21:08:12 +00:00

LibPthread: Implement a basic first pthread mutex

This patch adds these API's:

- pthread_mutex_init()
- pthread_mutex_lock()
- pthread_mutex_unlock()

No mutex attributes are supported yet, so we only do the simplest mutex
wihout recursive locking.
This commit is contained in:
Andreas Kling 2019-11-16 12:19:58 +01:00
parent 73d6a69b3f
commit 66a2b582c3
3 changed files with 84 additions and 7 deletions

View file

@ -1,15 +1,24 @@
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int, char**)
static int mutex_test();
int main(int argc, char** argv)
{
if (argc == 2 && *argv[1] == 'm')
return mutex_test();
printf("Hello from the first thread!\n");
pthread_t thread_id;
int rc = pthread_create(&thread_id, nullptr, [](void*) -> void* {
printf("Hi there, from the second thread!\n");
pthread_exit((void*)0xDEADBEEF);
return nullptr;
}, nullptr);
int rc = pthread_create(
&thread_id, nullptr, [](void*) -> void* {
printf("Hi there, from the second thread!\n");
pthread_exit((void*)0xDEADBEEF);
return nullptr;
},
nullptr);
if (rc < 0) {
perror("pthread_create");
return 1;
@ -23,3 +32,41 @@ int main(int, char**)
printf("Okay, joined and got retval=%p\n", retval);
return 0;
}
static pthread_mutex_t mutex;
int mutex_test()
{
int rc = pthread_mutex_init(&mutex, nullptr);
if (rc < 0) {
perror("pthread_mutex_init");
return 1;
}
pthread_t thread_id;
rc = pthread_create(
&thread_id, nullptr, [](void*) -> void* {
printf("I'm the secondary thread :^)\n");
for (;;) {
pthread_mutex_lock(&mutex);
printf("Second thread stole mutex\n");
sleep(1);
printf("Second thread giving back mutex\n");
pthread_mutex_unlock(&mutex);
sleep(1);
}
pthread_exit((void*)0xDEADBEEF);
return nullptr;
},
nullptr);
if (rc < 0) {
perror("pthread_create");
return 1;
}
for (;;) {
pthread_mutex_lock(&mutex);
printf("Obnoxious spam!\n");
pthread_mutex_unlock(&mutex);
usleep(10000);
}
return 0;
}