首先,不加锁,打印两个不同线程的数据,会出现sleep时cpu被抢占的情况出现:
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
pthread_mutex_t mutex; //定义锁
void *tfn(void *arg)
{
while (1) {
// pthread_mutex_lock(&mutex); //加锁
printf("hello ");
sleep(1); /*模拟长时间操作共享资源,导致cpu易主,产生与时间有关的错误*/
printf("world\n");
// pthread_mutex_unlock(&mutex); //解锁
sleep(1);//睡眠,释放cpu
}
return NULL;
}
int main(void)
{
pthread_t tid;
// pthread_mutex_init(&mutex, NULL); //初始化锁 mutex==1
pthread_create(&tid, NULL, tfn, NULL);
while (1)
{
// pthread_mutex_lock(&mutex); //加锁
printf("HELLO ");
sleep(1);
printf("WORLD\n");
// pthread_mutex_unlock(&mutex); //解锁
sleep(1);
}
// pthread_mutex_destroy(&mutex); //销毁锁
return 0;
}
/*线程之间共享资源stdout*/
使用线程锁时,cpu需要等待该线程完成输出之后,下一个线程再进入
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
pthread_mutex_t mutex; //定义锁
void *tfn(void *arg)
{
while (1) {
pthread_mutex_lock(&mutex); //加锁
printf("hello ");
sleep(1); /*模拟长时间操作共享资源,导致cpu易主,产生与时间有关的错误*/
printf("world\n");
pthread_mutex_unlock(&mutex); //解锁
sleep(1);//睡眠,释放cpu
}
return NULL;
}
int main(void)
{
pthread_t tid;
pthread_mutex_init(&mutex, NULL); //初始化锁 mutex==1
pthread_create(&tid, NULL, tfn, NULL);
while (1)
{
pthread_mutex_lock(&mutex); //加锁
printf("HELLO ");
sleep(1);
printf("WORLD\n");
pthread_mutex_unlock(&mutex); //解锁
sleep(1);
}
pthread_mutex_destroy(&mutex); //销毁锁
return 0;
}
/*线程之间共享资源stdout*/