目录
1.目标需求
想要主线程和子线程分别完整打印出HELLOWORLD和helloword,每个线程都要分两次打印,不能一起打印。实现这个需求。
2.分析
标准输出对于两个线程来说也是共享资源,需要加上对共享资源的保护。这里需要实现的是线程间的同步。
3.不符合要求的代码
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
void *tnf(void *arg)
{
srand(time(NULL));
while(1)
{
printf("hello");
sleep(rand()%3);
printf("world\n");
sleep(rand()%3);
}
return NULL;
}
int main()
{
pthread_t tid;
srand(time(NULL));
pthread_create(&tid,NULL,tnf,NULL);
while(1)
{
printf("HELLO");
sleep(rand()%3);
printf("WORLD\n");
sleep(rand()%3);
}
return 0;
}
4.符合要求的代码
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
pthread_mutex_t mutex;
void *tnf(void *arg)
{
srand(time(NULL));
while(1)
{
pthread_mutex_lock(&mutex);
printf("hello");
sleep(rand()%3);
printf("world\n");
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
return NULL;
}
int main()
{
pthread_t tid;
srand(time(NULL));
pthread_create(&tid,NULL,tnf,NULL);
while(1)
{
pthread_mutex_lock(&mutex);
printf("HELLO");
sleep(rand()%3);
printf("WORLD\n");
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
pthread_mutex_destroy(&mutex);
return 0;
}
5.观察与思考
以下代码,与上一份代码作比较,结合打印现象思考关于锁的粒度与CPU被夺走的可能性:
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
pthread_mutex_t mutex;
void *tnf(void *arg)
{
srand(time(NULL));
while(1)
{
pthread_mutex_lock(&mutex);
printf("hello");
sleep(rand()%3);
printf("world\n");
sleep(rand()%3);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main()
{
pthread_t tid;
srand(time(NULL));
pthread_create(&tid,NULL,tnf,NULL);
while(1)
{
pthread_mutex_lock(&mutex);
printf("HELLO");
sleep(rand()%3);
printf("WORLD\n");
sleep(rand()%3);
pthread_mutex_unlock(&mutex);
}
pthread_mutex_destroy(&mutex);
return 0;
}
6.说明
在访问共享资源前加锁,访问结束后立即解锁,一般来说,在满足需求的情况下,锁的粒度越小越好。