主要用到函数:
#include <pthread.h> pthread_create(&tid[i], nullptr, Sale_ticket, static_cast<void*>(&i));//创建线程 pthread_join(tid[i], nullptr);//等待线程终止 pthread_mutex_t mv_num = PTHREAD_MUTEX_INITIALIZER;//初始化锁 pthread_mutex_lock(&mv_num);//上锁 pthread_mutex_unlock(&mv_num);//开锁 pthread_mutex_destroy(&mv_num);//销毁锁
#include <time.h> time_t timep; time (&timep); //获取系统时间 ctime (&timep); //转换成字符串
#include <unistd.h>
sleep()
程序模拟了4个窗口,一起卖20张票。
1 #include <stdio.h> 2 #include <pthread.h> 3 #include <unistd.h> 4 #include <time.h> 5 #define WINDOW_NUM 4 6 int total = 20; 7 pthread_mutex_t mv_num = PTHREAD_MUTEX_INITIALIZER; 8 9 void* Sale_ticket(void *id) 10 { 11 int Window_id = *static_cast<int*>(id) + 1; 12 time_t timep; 13 time (&timep); 14 printf("Window %d starts saling tickets AT %s", Window_id, ctime(&timep)); 15 while(1) 16 { 17 pthread_mutex_lock(&mv_num); 18 if (total <= 0) { 19 pthread_mutex_unlock(&mv_num); 20 break; 21 } 22 time (&timep); 23 printf("Window %d Sales ticket %d AT %s", Window_id, total--, ctime(&timep)); 24 pthread_mutex_unlock(&mv_num); 25 sleep(Window_id); 26 } 27 return nullptr; 28 } 29 30 int main() 31 { 32 pthread_t tid[WINDOW_NUM]; 33 int i = 0; 34 for (i = 0; i < WINDOW_NUM; ++i) 35 { 36 pthread_create(&tid[i], nullptr, Sale_ticket, static_cast<void*>(&i)); 37 sleep(1); 38 } 39 for (i = 0; i < WINDOW_NUM; ++i) 40 { 41 pthread_join(tid[i], nullptr); 42 } 43 pthread_mutex_destroy(&mv_num); 44 return 0; 45 }
实验结果如图:
一些结论:
1、网上对linux下sleep()休眠的是整个进程还是某一个线程的答案不统一,在我的测试环境下(ubuntu 16.04 LTS),发现sleep休眠的是单独线程。理由:
结果中,窗口1每1秒卖一张票,窗口2每2秒卖1张票,主线程每1秒创建一个新窗口,相互之间时间间隔不影响。
2、printf线程安全,cout线程不安全。测试发现cout输出时,线程之间相互干扰打断。
3、ctime (&timep) 转换过来的字符串,自带换行符。