Linux多线程同步——信号量

时间:2023-02-21 21:29:39

线程同步


同步主线程与子线程

test.c
#include <pthread.h>
#include <sys/syscall.h>
#include <fcntl.h>
#include <semaphore.h>
#include <stdlib.h>
#include <stdio.h>

void* ret_result_thread1;
sem_t *sem;

void* thread1Func(void* arg)
{
printf("childThread id:%u is running\n", syscall(SYS_gettid));
sleep(2);
sem_post(sem);
pthread_exit((void*)0);

}

int main(int argc, char** argv)
{

printf("main thread start\n");

const char* semName="sem_name";
sem = sem_open(semName,O_CREAT,0644,0);

pthread_t thread1;
int ret1;

if( (ret1 = pthread_create(&thread1,NULL,thread1Func,NULL)) != 0)
{
perror("thread1 create failed");
}

sem_wait(sem);
printf("main thread end\n");
pthread_join(thread1,ret_result_thread1);

sem_close(sem);
sem_unlink(semName);

return 0;
}

Linux多线程同步——信号量


子线程之间的同步

使用单个信号量

#include <pthread.h>
#include <sys/syscall.h>
#include <fcntl.h>
#include <semaphore.h>
#include <stdlib.h>
#include <stdio.h>

void* ret_result_thread1;
void* ret_result_thread2;
sem_t *sem;

void* thread1Func(void* arg)
{
printf("childThread1 is running\n");
sleep(2);
sem_post(sem);
pthread_exit((void*)0);
}

void* thread2Func(void* arg)
{
sem_wait(sem);
printf("childThread2 is running\n");
sleep(2);
pthread_exit((void*)0);
}

int main(int argc, char** argv)
{

printf("main thread start\n");

const char* semName="sem_name";
sem = sem_open(semName,O_CREAT,0644,0);

pthread_t thread1,thread2;
int ret1;
int ret2;
if( (ret1 = pthread_create(&thread1,NULL,thread1Func,NULL)) != 0)
{
perror("thread1 create failed");
}

if( (ret2 = pthread_create(&thread2,NULL,thread2Func,NULL)) != 0)
{
perror("thread2 create failed");
}

printf("main thread end\n");

pthread_join(thread1,ret_result_thread1);
pthread_join(thread2,ret_result_thread2);

sem_close(sem);
sem_unlink(semName);
return 0;
}

使用两个信号量

test.c
#include <pthread.h>
#include <sys/syscall.h>
#include <fcntl.h>
#include <semaphore.h>
#include <stdlib.h>
#include <stdio.h>

void* ret_result_thread1;
void* ret_result_thread2;
sem_t *sem1;
sem_t *sem2;

void* thread1Func(void* arg)
{
sem_wait(sem1);
printf("childThread1 is running\n");
sleep(2);
sem_post(sem2);
pthread_exit((void*)0);

}

void* thread2Func(void* arg)
{
sem_wait(sem2);
printf("childThread2 is running\n");
sleep(2);
sem_post(sem1);
pthread_exit((void*)0);
}

int main(int argc, char** argv)
{

printf("main thread start\n");
const char* semName1="sem_name1";
sem1 = sem_open(semName1,O_CREAT,0644,1);

const char* semName2="sem_name2";
sem2 = sem_open(semName2,O_CREAT,0644,0);

pthread_t thread1,thread2;
int ret1;
int ret2;
if( (ret1 = pthread_create(&thread1,NULL,thread1Func,NULL)) != 0)
{
perror("thread1 create failed");
}

if( (ret2 = pthread_create(&thread2,NULL,thread2Func,NULL)) != 0)
{
perror("thread2 create failed");
}

printf("main thread end\n");

pthread_join(thread1,ret_result_thread1);
pthread_join(thread2,ret_result_thread2);

sem_close(sem1);
sem_close(sem2);

sem_unlink(semName1);
sem_unlink(semName2);
return 0;
}

Linux多线程同步——信号量
主线程运行结束后,线程1开始运行,休眠2秒后开始运行线程2