给线程一个顺序(及线程的同步)
信号量(线程同步)
头文件
#include <semaphore.h>
信号量的初始化:
int sem_init(sem_t *sem, int pshared, unsigned int value);
return: 0成功 -1失败
sem_t *sem: 要初始化的信号量
int pshared: 0表示线程间 1表示进程
unsigned int value: 初始化信号的资源数
p操作:
sem_wait
申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1 ,程序继续执行
v操作:
sem_post
V操作:释放资源,对应资源+1
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <unistd.h> #include <semaphore.h> /* 按顺序输出我是1我是2不会乱序。 */ sem_t rt, dt;//定义两个信号量 void *fun_1(void *arg)//线程1 { char *p = (char *)arg; while(1) { //申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1,程序继续执行 sem_wait(&rt); puts(p); sleep(1); //释放资源,对应资源+1 sem_post(&dt); } } void *fun_2(void *arg)//线程2 { char *p = (char *)arg; while(1){ //申请资源,如果没有资源,则程序阻塞休眠,如果有资源,资源数-1,程序继续执行 sem_wait(&dt); puts(p); sleep(1); //释放资源,对应资源+1 sem_post(&rt); } } int main()//main函数内为主线程,主线程在运行子线程才能正常运行。 { pthread_t tid_1; pthread_t tid_2; if(0 != pthread_create(&tid_1, NULL, fun_1, "I am one!")){ perror("pthread_create1"); return -1; } if(0 != pthread_create(&tid_2, NULL, fun_2, "I am two!")){ perror("pthread_create1"); return -1; } //初始化信号量 if(0 != sem_init(&rt, 0, 1))//给rt分配1个资源 { perror("sem_init"); return -1; } if(0 != sem_init(&dt, 0, 0))//给dt分配0个资源 { perror("sem_init"); return -1; } while(1) { sleep(3); } }
注意:多线程程序在编译的时候需要链接对应的库-lpthread