C++ 多线程和互斥锁
c++ multithreading and mutex
我对C/Linux多线程有点熟悉,但这次我必须在Windows上使用C++做一些工作,但我无法掌握它。在我的程序中,我有 2 个函数不断尝试访问同一个文件以执行一些打印操作,发生的事情是其中一个永远不会工作,这让我认为一个函数永远无法打开文件,因为另一个函数总是可以在上面书写。如何实现线程来实现此工作?代码大致如下:
std:mutex mut;
main(){
while(1){
//get mychar from user
print1(mychar, "my.txt");
print2();
}
}
print1(int i, char* file){
FILE *f = fopen(file, "a");
/*print operations
..
.*/
fclose(f);
return 0;
}
void print2(){
/*getting a string
...
Sleep(200);
getting another string
...*/
char getX[]; //fill buffers with the strings accordingly
char getY[]; //basically i want to know if the initial string has changed
if(*getX != *getY){
std::Lock_guard<std::mutex> guard(mut);
FILE *f = fopen("my.txt", "a");
fprintf(f, "%s ", getY);
fclose(f);
}
getX = NULL;
getY = NULL;
}
第一个问题是你的互斥锁是在main中本地声明的。它们需要可供您的函数访问。如果程序中所有相关的事情都发生在这个文件中,那么使用全局声明的互斥锁是完全可以的。
第二个问题是您没有正确锁定任一线程。如果您要打开两个文件进行追加,那么最安全的做法是在打开时锁定并在关闭时解锁。您可以通过在函数条目上使用全局互斥锁初始化锁保护来实现此目的:
std::mutex mut;
main(){
while(1){
//get mychar from user
print1(mychar, "my.txt");
print2();
}
}
print1(int i, char* file){
std::lock_guard<std::mutex> guard(mut);
FILE *f = fopen(file, "a");
/*print operations
..
.*/
fclose(f);
return 0;
}
void print2(){
/*getting a string
...
Sleep(200);
getting another string
...*/
char getX[]; //fill buffers with the strings accordingly
char getY[]; //basically i want to know if the initial string has changed
if(*getX != *getY){
std::lock_guard<std::mutex> guard(mut);
FILE *f = fopen("my.txt", "a");
fprintf(f, "%s ", getY);
fclose(f);
}
getX = NULL;
getY = NULL;
}
正如其他人指出的那样,您甚至在这里都没有使用并发性。这只是一个接一个的函数调用。如果要使用线程,可以在while(1)
循环中执行此操作:
while(1){
std::thread thread1(print1, mychar, "my.text");
std::thread thread2(print2);
thread1.join();
thread2.join();
}
编辑:我已经编辑了您的print2
函数,使其仅在需要写入文件时才打开文件。这使得并发在应用程序结构中更加明智。
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误