我有一个多线程(3线程)C ++应用程序,可以在一个位置创建三个文件。应用程序获取启动和停止命令作为输入(比如运行时的用户输入)。对于每个启动 - 停止对,所有三个线程都应该在同一个文件夹中创建文件。
我使用单个shell脚本为三个线程中的每个线程生成的每个文件创建文件路径。有一个shell脚本从每个线程中调用。 shell脚本读取一个名为“count”的公共文件中维护的数字,并使用此计数创建一个字符串(文件路径),并在目录中附加计数以表示新的集合。 “count”文件中的数字只能由接收更新标志的第一个线程或用户输入的“start_flag”更新
shell脚本在C ++文件中运行,如下所示:
捕获起始文件更新的全局变量:
bool start_flag = false;
在每个线程中,有类似的东西:
if(true == start_flag) /*one of the threads that first receives the start signal*/
system("./folderpath.sh"); /*This will create a new string by incrementing count and update the file path in a file which will be later read*/
else
system("./folderpath.sh"); /*This will create a string using teh same count previously updated by another thread */
在shell脚本中,我创建了一个文本字符串并将其写入名为Filepath.txt的文件中。我读了这个文件,最后在生成的路径中打开了一个文件
我想确保在每个Filepath.txt中更新正确的字符串,并读取每个线程在Filepath.txt中更新的内容,没有任何问题
我发现我没有得到预期的结果。
我该如何解决这个问题?
答案 0 :(得分:1)
首先,您的代码似乎没有更改folderpath.sh脚本的参数,具体取决于start_flag的值。如果不将某些类型的信息传递给shell脚本,那么很难让它为一个线程做一些不同于其他线程的事情。
其次,您需要使用某种互斥来确保只有一个线程可以看到" start_flag"设置为" true"一次。由于您提到了shell脚本,因此您可以安全地猜测您是否在POSIX系统上,这意味着您可以使用pthreads API。
由于您在响应某种输入时启动了该进程,因此拥有每个线程等待的条件变量可能是有意义的,然后在主线程上运行一次shell脚本用适当的标志让它创建一个新的路径。完成后,广播条件变量,让它启动所有其他线程以使用新路径。