Linux多线程同步——信号量

线程同步

同步主线程与子线程

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多线程同步——信号量_第1张图片

子线程之间的同步

使用单个信号量

#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多线程同步——信号量_第2张图片
主线程运行结束后,线程1开始运行,休眠2秒后开始运行线程2

你可能感兴趣的:(多线程,linux,线程,sem,子线程同步)