Linux多线程同步——信号量
2016-03-30 21:36
489 查看
线程同步
同步主线程与子线程
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; }
子线程之间的同步
使用单个信号量#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; }
主线程运行结束后,线程1开始运行,休眠2秒后开始运行线程2
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- Python3写爬虫(四)多线程实现数据爬取
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程