当前位置:首页 > 编程笔记 > 正文
已解决

利用互斥锁实现多个线程写一个文件

来自网友在路上 181881提问 提问时间:2023-10-12 16:20:08阅读次数: 81

最佳答案 问答题库818位专家为你答疑解惑

代码

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>FILE *fp;//线程函数1
void *wrfunc1(void *arg);
//线程函数2
void *wrfunc2(void *arg);
//线程函数3
void *wrfunc3(void *arg);//静态创建互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int main(int argc, char *argv[])
{//三个线程idpthread_t tid1;pthread_t tid2;pthread_t tid3;//三个线程参数int arg1 = 1;int arg2 = 2;int arg3 = 3;//三个线程返回值void *ret1;void *ret2;void *ret3;if ((fp = fopen("test.txt", "a+")) == NULL){perror("fopen");}//创建三个线程pthread_create(&tid1, NULL, wrfunc1, &arg1);sleep(2);pthread_create(&tid2, NULL, wrfunc2, &arg2);sleep(2);pthread_create(&tid3, NULL, wrfunc3, &arg3);sleep(2);//延长休眠时间,保证三个线程都有机会执行sleep(100);//取消线程pthread_cancel(tid1);pthread_cancel(tid2);pthread_cancel(tid3);//回收线程pthread_join(tid1, &ret1);pthread_join(tid2, &ret2);pthread_join(tid3, &ret3);return 0;
}void *wrfunc1(void *arg)
{	char str[] = "I am thread1, I write a line\n"; //线程要写入文件的字符串int i;printf("this is thread%d\n", *(int*)arg);while (1){pthread_mutex_lock(&mutex); //加入互斥锁//按字符将字符串循环写入文件for (i = 0; i < strlen(str); i++){fputc(str[i], fp);usleep(1);}pthread_mutex_unlock(&mutex); //释放互斥锁pthread_testcancel(); //设置线程取消点}sleep(10);pthread_exit("thread1 return"); //退出线程
}void *wrfunc2(void *arg)
{char str[] = "I am thread2, I write a line\n";int i;printf("this is thread%d\n", *(int*)arg);while (1){pthread_mutex_lock(&mutex);for (i = 0; i < strlen(str); i++){fputc(str[i], fp);usleep(1);}pthread_mutex_unlock(&mutex);pthread_testcancel();}sleep(10);pthread_exit("thread2 return");
}void *wrfunc3(void *arg)
{char str[] = "I am thread3, I write a line\n";int i;printf("this is thread%d\n", *(int*)arg);while (1){pthread_mutex_lock(&mutex);for (i = 0; i < strlen(str); i++){fputc(str[i], fp);usleep(1);}pthread_mutex_unlock(&mutex);pthread_testcancel();}sleep(10);pthread_exit("thread3 return");
}

总结

  • 在这个代码中,是需要加入 pthread_cancel() 函数的因为:线程函数wrfunc1、wrfunc2和wrfunc3都包含一个无限循环,循环内部没有明确的退出条件。没有明确的退出条件意味着线程函数会一直执行下去,直到程序结束或者发生了某个特殊的情况导致线程被强制终止。在这种情况下,如果没有使用pthread_cancel,线程将一直运行下去,不会自动退出。
  • 这个代码中的 sleep(100) 是必须加入的,如果不加入那么 线程 2 和 线程 3 将没有机会执行,也就看不到正确的结果。
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"利用互斥锁实现多个线程写一个文件":http://eshow365.cn/6-19197-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!