semaphore.h 提供的是 POSIX 标准定义的 semaphore 接口,而 sys/sem.h 里 提供的是符合 System V 标准的 semaphore接口 (semget, semop, ...),这些接口都比较老了, linux提供主要是为了兼容老代码
/** @file main628.cpp* @note System Technology Co., Ltd. All Right Reserved.* @brief* @author * @date 2019-6-28* @note v1.0.0 Created* @history* @warning*/#include#include #include #include #include #define NUM 5int queue[NUM];sem_t blank_number, product_number;void *producer(void *arg){ int p = 0; while (1) { sem_wait(&blank_number); queue[p] = rand() % 1000 + 1; printf("Produce %d\n", queue[p]); sem_post(&product_number); p = (p+1)%NUM; sleep(rand()%5); }}void *consumer(void *arg){ int c = 0; while (1) { sem_wait(&product_number); printf("Consume %d\n", queue[c]); queue[c] = 0; sem_post(&blank_number); c = (c+1)%NUM; sleep(rand()%5); }}int main(int argc, char *argv[]){ pthread_t pid, cid; sem_init(&blank_number, 0, NUM); sem_init(&product_number, 0, 0); pthread_create(&pid, NULL, producer, NULL); pthread_create(&cid, NULL, consumer, NULL); pthread_join(pid, NULL); pthread_join(cid, NULL); sem_destroy(&blank_number); sem_destroy(&product_number); return 0;}
/*!* Email: xmain@gmail.com* Auth: c* Date: 2019-6-30* File: semaphoreTest.cpp* Class: %{Cpp:License:ClassName} (if applicable)* Brief:* Note: */#include#include #include #include #include #include sem_t bin_sem;void *thread_function1(void *arg){ printf("thread_function1--------------sem_wait\n"); sem_wait(&bin_sem); printf("sem_wait\n"); while (1) { printf("thread_function1\n"); }}void *thread_function2(void *arg){ printf("thread_function2--------------sem_post\n"); sem_post(&bin_sem); printf("sem_post\n"); while (1) { printf("thread_function2\n"); }}int main(){ int res; pthread_t a_thread, a_thread2; void *thread_result; res = sem_init(&bin_sem, 0, 0); if (res != 0) { perror("Semaphore initialization failed"); } printf("sem_init\n"); res = pthread_create(&a_thread, NULL, thread_function1, NULL); if (res != 0) { perror("Thread creation failure"); } //printf("thread_function1\n"); sleep (5); printf("sleep\n"); res = pthread_create(&a_thread2, NULL, thread_function2, NULL); if (res != 0) { perror("Thread creation failure"); } while (1) { printf("main\n"); }}
#include#include #include #include #include #include using namespace std;//用户从终端输入任意字符然后统计个数显示,输入end则结束//使用多线程实现:主线程获取用户输入并判断是否退出,子线程计数char buf[100]={ 0};static int flag = 0;sem_t sem;// 子线程程序,作用是统计buf中的字符个数并打印void *func(void*arg){ // 子线程首先应该有个循环 // 循环中阻塞在等待主线程激活的时候,子线程被激活后就去获取buf中的字符 // 长度,然后打印;完成后再次被阻塞 printf("func before 1th wait\n"); sem_wait(&sem); printf("func after 1th wait\n"); while(flag==0) { printf("长度为:%d.\n",strlen(buf)); memset(buf, 0, sizeof(buf)); printf("func before 2th wait\n"); sem_wait(&sem); printf("func after 2th wait\n"); } pthread_exit(NULL);}int main(void){ int ret=-1; pthread_t th; sem_init(&sem,0,0); ret=pthread_create(&th,NULL,func,NULL); if (ret != 0) { printf("pthread_create error.\n"); return -1; } printf("输入一个字符串,以回车结束.\n"); while(scanf("%s",buf)) { // 去比较用户输入的是不是end,如果是则退出,如果不是则继续 if(!strncmp(buf,"end",3)) { printf("输入的字符串为:%s",buf); flag=1; printf("main before 1th wait\n"); sem_post(&sem); printf("main after 1th wait\n"); break; } // 主线程在收到用户收入的字符串,并且确认不是end后 // 就去发信号激活子线程来计数。 // 子线程被阻塞,主线程可以激活,这就是线程的同步问题。 // 信号量就可以用来实现这个线程同步 printf("main before 2th wait\n"); sem_post(&sem); printf("main after 2th wait\n"); } // 回收子线程 printf("等待回收子线程\n"); ret = pthread_join(th, NULL); if (ret != 0) { printf("pthread_join error.\n"); exit(-1); } printf("子线程回收成功\n"); sem_destroy(&sem); return 0;}