生活随笔
收集整理的這篇文章主要介紹了
操作系统实践(九)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??這應該是最后一次,還是認認真真滴完成。
??本次內容圍繞一個問題,線程并發時對于全局變量會錯位控制。所以必須加以限制,限制的手段有兩種:條件變量、互斥信號量。
?? 一、條件變量
??條件變量的操作就三個:初始化、等待、喚醒線程。具體的用法如下:
??有了條件變量,就可以在全局變量前面加上。線程并發時就會在執行前獲取條件變量的情況了。
?? 二、互斥信號量
??信號量的使用是通過鎖來實現的,所以信號量的操作包括初始化、上鎖、解鎖。具體如下:
?? 其實我覺得二者沒有什么區別,完成的功能都一樣。而且在理論課上只講了信號量,沒有提及條件變量。所以可能各有所好吧,我就不知道啦~
??老規矩,還是有作業。是解決一個經典的生產者-消費者問題,做了一點兒拓展,加了一個計算者。題目如下:
??代碼如下:
#include
<stdio
.h
>
#include
<unistd
.h
>
#include
<pthread
.h
>#define
CAPACITY 4
int buffer1
[CAPACITY];
int buffer2
[CAPACITY];
int in1
;
int out1
;
int in2
;
int out2
;int
buffer1_is_empty()
{return in1
== out1
;
}int
buffer1_is_full()
{return (in1
+ 1) % CAPACITY == out1
;
}int
buffer2_is_empty()
{return in2
== out2
;
}int
buffer2_is_full()
{return (in2
+ 1) % CAPACITY == out2
;
}
int
get_item1()
{int item
;item
= buffer1
[out1
];out1
= (out1
+ 1) % CAPACITY;return item
;
}void put_item1(int item)
{buffer1
[in1
] = item
;in1
= (in1
+ 1) % CAPACITY;
}
int
get_item2()
{int item
;item
= buffer2
[out2
];out2
= (out2
+ 1) % CAPACITY;return item
;
}void put_item2(int item)
{buffer2
[in2
] = item
;in2
= (in2
+ 1) % CAPACITY;
}pthread_mutex_t mutex
;
pthread_cond_t wait_empty_buffer1
;
pthread_cond_t wait_full_buffer1
;pthread_cond_t wait_empty_buffer2
;
pthread_cond_t wait_full_buffer2
;#define
ITEM_COUNT (CAPACITY * 2)
void *consume(void *arg)
{int i
;int item
;for (i
= 0; i
< ITEM_COUNT; i
++) { pthread_mutex_lock(&mutex
);while (buffer2_is_empty())pthread_cond_wait(&wait_full_buffer2
, &mutex
);item
= get_item2(); printf(" consume item: %c\n", item
); pthread_cond_signal(&wait_empty_buffer2
);pthread_mutex_unlock(&mutex
);}return NULL;
}
void *produce(void *arg)
{int i
;int item
;for (i
= 0; i
< ITEM_COUNT; i
++) { pthread_mutex_lock(&mutex
);while (buffer1_is_full()) pthread_cond_wait(&wait_empty_buffer1
, &mutex
);item
= 'a' + i
;put_item1(item
);printf("produce item: %c\n", item
); pthread_cond_signal(&wait_full_buffer1
);pthread_mutex_unlock(&mutex
);}return NULL;
}
void *calculate(void *arg)
{int i
;int item
;for (i
= 0; i
< ITEM_COUNT; i
++) {pthread_mutex_lock(&mutex
);while (buffer1_is_empty())pthread_cond_wait(&wait_full_buffer1
, &mutex
);item
= get_item1();item
= item
-32; pthread_cond_signal(&wait_empty_buffer1
);pthread_mutex_unlock(&mutex
);pthread_mutex_lock(&mutex
);while(buffer2_is_full())pthread_cond_wait(&wait_empty_buffer2
, &mutex
);put_item2(item
);pthread_cond_signal(&wait_full_buffer2
);pthread_mutex_unlock(&mutex
);}return NULL;}
int
main()
{ pthread_t consumer_tid
;pthread_t calculator_tid
;pthread_mutex_init(&mutex
, NULL);pthread_cond_init(&wait_empty_buffer1
, NULL);pthread_cond_init(&wait_full_buffer1
, NULL);pthread_cond_init(&wait_empty_buffer2
, NULL);pthread_cond_init(&wait_full_buffer2
, NULL);pthread_create(&calculator_tid
, NULL, calculate
, NULL);pthread_create(&consumer_tid
, NULL, consume
, NULL);produce(NULL); pthread_join(calculator_tid
, NULL);pthread_join(consumer_tid
, NULL);return 0;}
??代碼如下:
#include
<stdio
.h
>
#include
<pthread
.h
>
#include
<unistd
.h
>#define
CAPACITY 4
int buffer1
[CAPACITY];
int in1
;
int out1
;
int buffer2
[CAPACITY];
int in2
;
int out2
;
int
buffer1_is_empty()
{return in1
== out1
;
}int
buffer1_is_full1()
{return (in1
+ 1) % CAPACITY == out1
;
}
int
buffer2_is_empty()
{return in2
== out2
;
}int
buffer2_is_full1()
{return (in2
+ 1) % CAPACITY == out2
;
}
int
get_item1()
{int item
;item
= buffer1
[out1
];out1
= (out1
+ 1) % CAPACITY;return item
;
}void put_item1(int item)
{buffer1
[in1
] = item
;in1
= (in1
+ 1) % CAPACITY;
}
int
get_item2()
{int item
;item
= buffer2
[out2
];out2
= (out2
+ 1) % CAPACITY;return item
;
}void put_item2(int item)
{buffer2
[in2
] = item
;in2
= (in2
+ 1) % CAPACITY;
}typedef struct
{int value
;pthread_mutex_t mutex
;pthread_cond_t cond
;
} sema_t
;
void sema_init(sema_t *sema, int value)
{sema
->value
= value
;pthread_mutex_init(&sema
->mutex
, NULL);pthread_cond_init(&sema
->cond
, NULL);
}void sema_wait(sema_t *sema)
{pthread_mutex_lock(&sema
->mutex
);while (sema
->value
<= 0)pthread_cond_wait(&sema
->cond
, &sema
->mutex
);sema
->value
--;pthread_mutex_unlock(&sema
->mutex
);
}void sema_signal(sema_t *sema)
{pthread_mutex_lock(&sema
->mutex
);++sema
->value
;pthread_cond_signal(&sema
->cond
);pthread_mutex_unlock(&sema
->mutex
);
}sema_t mutex_sema
;
sema_t empty_buffer1_sema
;
sema_t full_buffer1_sema
;
sema_t empty_buffer2_sema
;
sema_t full_buffer2_sema
;#define
ITEM_COUNT (CAPACITY * 2)
void *consume(void *arg)
{int i
;int item
;for (i
= 0; i
< ITEM_COUNT; i
++) { sema_wait(&full_buffer2_sema
);sema_wait(&mutex_sema
);item
= get_item2();printf(" consume item: %c\n", item
); sema_signal(&mutex_sema
);sema_signal(&empty_buffer2_sema
);}return NULL;
}
void *produce()
{int i
;int item
;for (i
= 0; i
< ITEM_COUNT; i
++) { sema_wait(&empty_buffer1_sema
);sema_wait(&mutex_sema
);item
= i
+ 'a';put_item1(item
);printf("produce item: %c\n", item
); sema_signal(&mutex_sema
);sema_signal(&full_buffer1_sema
);}return NULL;
}
void *calculate()
{int i
;int item
;for (i
= 0; i
< ITEM_COUNT; i
++) {sema_wait(&full_buffer1_sema
);sema_wait(&mutex_sema
);item
= get_item1();item
= item
- 32;sema_signal(&mutex_sema
);sema_signal(&empty_buffer1_sema
);sema_wait(&empty_buffer2_sema
);sema_wait(&mutex_sema
);put_item2(item
);sema_signal(&mutex_sema
);sema_signal(&full_buffer2_sema
);}return NULL;
}
int
main()
{ pthread_t consumer_tid
;pthread_t calculator_tid
;sema_init(&mutex_sema
, 1);sema_init(&empty_buffer1_sema
, CAPACITY - 1);sema_init(&full_buffer1_sema
, 0);sema_init(&empty_buffer2_sema
, CAPACITY - 1);sema_init(&full_buffer2_sema
, 0);pthread_create(&consumer_tid
, NULL, consume
, NULL);pthread_create(&calculator_tid
, NULL, calculate
, NULL);produce();pthread_join(consumer_tid
, NULL);pthread_join(calculator_tid
, NULL);return 0;
}
因作者水平有限,如有錯誤之處,請在下方評論區指出,謝謝!
總結
以上是生活随笔為你收集整理的操作系统实践(九)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。