在多線程同步開發中,爲了實現執行線程在條件未到達時等待條件到達,進而用忙等待實現等待,這樣大大浪費了CPU資源且CPU佔用很大,致使服務器系統總體性能降低。爲了解決CPU佔用大的問題,用信號量替代忙等待條件,實現執行線程在條件未到達時用阻塞等待條件到達。下面是用二進制信號量實現多線程間同步簡單設計模型。
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<semaphore.h>
#define NUM 8 //---線程建立個數
sem_t sem_main[NUM]; //--主線程對應的(建立線程)信號量
sem_t sem_thr[NUM]; //--每一個建立線程對應的信號量
void sem_test_init()
{
int i = 0;
//主線程對應的(建立線程)信號量 初始化爲1
for(i = 0; i < NUM; i++)
{
sem_init(&sem_main[i], 0, 1);
}
//--每一個建立線程對應的信號量 初始化爲0
for(i = 0; i < NUM; i++)
{
sem_init(&sem_thr[i], 0, 0);
}
}
void *thr_fun(void *argv)
{
int num = (int)argv;
printf("num=%d\n", num);
int thr_flag = 1;
int times = 0;
int i = 0;
while(thr_flag)
{
sem_wait(&sem_thr[num]);
for(i = 0; i < 7; i++)
printf("thr OK\n");
//sleep(1);
sem_post(&sem_main[num]);
times++;
if(times == 3) //退出無限循環
{
//sleep(1);
//thr_flag = 0;
}
}
usleep(100);
}
int main(int argc, char *argv[])
{
int irs_flag = 1;
int main_flag = 0;
int i = 0;
pthread_t tid[NUM];
int j = 0;
sem_test_init();
for(j = 0; j < NUM; j++)
{
pthread_create(&tid[j], NULL, thr_fun, (void *)j);
printf("***************j=%d\n", j);
}
//sleep(1);
while(irs_flag)
{
for(i = 0; i < NUM; i++)
{
sem_wait(&sem_main[i]);
}
printf("sem_main %d times sem_wait OK\n", main_flag);
printf("sem_thr %d times sem_post start\n", main_flag);
for(i = 0; i < NUM; i++)
{
sem_post(&sem_thr[i]);
}
main_flag++;
if(main_flag == 3) //退出無限循環
{
//sleep(1);
//irs_flag = 0;
}
}
usleep(200);
printf("ININININININ\n");
//等待線程退出
for(i = 0; i < NUM; i++)
{
pthread_join(tid[i], NULL);
printf("OUTOUTOUTOUT\n");
}
// printf("OUTOUTOUTOUT\n");
//銷燬相應信號量
for(i = 0; i < NUM; i++)
{
sem_destroy(&sem_main[i]);
sem_destroy(&sem_thr[i]);
}
printf("VVVVVVVVVVVVVV\n");
}服務器