题目要求:
The outputshould be:
from thread 10
from thread 9
from thread 8
from thread 7
from thread 6
from thread 5
from thread 4
from thread 3
from thread 2
from thread 1
Do this using one mutex, one condition variable and thepthread_cond_broadcast function call. You can use global variables, like globalintegers etc. Please only modify thefunc()function,do not modify the mainfunction except for initializing condition variables and mutexes.
源文件如下所示:
#include
#include
#include
#include
void * func(void * arg)
{
printf("from thread %d\n", (int)arg);
return (NULL);
}
int main(int argc, char* argv[]) {
int n,i;
pthread_t threads[10];
for (i = 0; i < 10; i++) {
pthread_create(&threads[i], NULL, func, (void*)i+1);
}
for (i = 0; i < 10; i++) {
pthread_join(threads[i], NULL);
}
exit(1);
}
用条件变量方式修改成功后代码如下:
#include
#include
#include
#include
pthread_mutex_t mutex;
pthread_cond_t cond;
int word = 10;
void * func(void * arg)
{
pthread_mutex_lock(&mutex);
sleep(1);
if(word != (int)arg)
{
pthread_cond_wait(&cond,&mutex);
}
while(word >= 1)
{
if(word == (int)arg)
{
printf("from thread %d\n", (int)arg);
word--;
pthread_cond_broadcast(&cond);
}
else
pthread_cond_wait(&cond,&mutex);
}
pthread_mutex_unlock(&mutex);
return(NULL);
}
int main(int argc, char* argv[]) {
int n,i;
pthread_t threads[10];
pthread_mutex_init(&mutex,NULL);//initialization condition variable
pthread_cond_init(&cond,NULL);
for (i = 0; i < 10; i++) {
pthread_create(&threads[i], NULL, func, (void*)i+1);
}
for (i = 0; i < 10; i++) {
pthread_join(threads[i], NULL);
}
exit(1);
}
用信号量方式修改成功后的源码:
#include
#include
#include
#include
#include
sem_t sem[10];
void *func(void * arg)
{
sleep(1);
if((int)arg >= 1)
{
if(sem_wait(&sem[(int)arg-1])== 0)
{
printf("from thread %d\n", (int)arg);
sem_post(&sem[(int)arg-2]);
}
}
return (NULL);
}
int main(int argc, char* argv[]) {
int n,i;
pthread_t threads[10];
for(i=0;i<9;i++)
sem_init(&sem[i],0,0);
sem_init(&sem[9],0,1);
for (i = 0; i < 10; i++) {
pthread_create(&threads[i], NULL, func, (void*)i+1);
}
for (i = 0; i < 10; i++) {
pthread_join(threads[i], NULL);
}
exit(1);
}