多个批处理文件访问/设置相同的共享/全局变量是否是线程安全的?

时间:2017-04-10 13:44:37

标签: batch-file cmd

fileOne.bat

SET varTest=5
START fileTwo.bat
SET varTest=8
PAUSE

fileTwo.bat

ECHO %varTest%

多个批处理文件是否访问/设置相同的共享/全局变量“线程安全”?

2 个答案:

答案 0 :(得分:2)

是。 filetwo.batfileone.bat的环境副本开头。

然而,由于第二个文件是start,因此这两个过程非常独立。他们不共享环境,因此fileone.bat中的变量对filetwo.bat中的变量不可见,filetwo.bat的环境也无法从fileone.bat看到}。

如果filetwo.bat call来自fileone.bat而不是start,那么filetwo.bat将需要在fileone.bat继续之前完成。 filetwo.bat一旦fileone.bat恢复后,fileone.bat所做的任何更改都会显示在其中。

如果您想在call内使用setlocal,则可以停止filetwo.bat的此行为。 filetwo.bat setlocal之前的fileone.bat所做的任何更改都将显示在setlocal,但filetwo.bat之后所做的任何更改都将在endlocal终止时撤消,或者遇到fileone.bat指令(之后所做的任何更改都会在#include<iostream> #include<opencv2\highgui\highgui.hpp> #include<opencv2\imgproc\imgproc.hpp> #include<opencv2\core\core.hpp> #include<opencv2/opencv.hpp> #include<opencv2/core/core.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/objdetect/objdetect.hpp> #include<Windows.h> #include <sstream> using namespace cv; using namespace std; void on_trackbar(int, void*); void createTrackbars(); void morphit(Mat &img); void toggle(int); const int MAX_NUM_OBJECTS = 500; const int FRAME_WIDTH = 900; const int FRAME_HEIGHT = 600; const int MIN_OBJECT_AREA = 20 * 20; const int MAX_OBJECT_AREA = FRAME_HEIGHT*FRAME_WIDTH / 1.5; Point middle; int l_MIN = 30; int l_MAX = 165; int a_MIN = 139; int a_MAX = 165; int b_MIN = 136; int b_MAX = 172; int kerode = 2; int kdilate = 5; bool domorph = true; bool showchangedframe = true; int main(int argc, char** argv) { createTrackbars(); on_trackbar(0, 0); int x, y; Mat frame, labframe, rangeframe; Mat newframe, newrf; int key; //VideoCapture cap(0); while ((key = waitKey(30)) != 27) { toggle(key); frame = imread(argv[1], 1); newframe = imread(argv[1], 1); //cap >> frame; //cap >> newframe; //flip(frame, frame, 180); //flip(newframe, newframe, 180); newframe = Scalar(0, 0, 0); cvtColor(frame, labframe, COLOR_BGR2Lab); inRange(labframe, Scalar(l_MIN, a_MIN, b_MIN), Scalar(l_MAX, a_MAX, b_MAX), rangeframe); newrf = rangeframe.clone(); int largest_area = 0; int largest_contour_index = 0; vector<vector<Point> > contours; findContours(newrf, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE); vector<Moments> mu(contours.size()); //get moments for (int i = 0; i < contours.size(); i++) { mu[i] = moments(contours[i], false); } vector<Point2f> mc(contours.size()); //get centers for (int i = 0; i < contours.size(); i++) { mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00); } for (int i = 0; i < contours.size(); i++) //iterate through each contour. { double a = contourArea(contours[i], false); //Find the area of contour if (a>largest_area) { largest_area = a; largest_contour_index = i; //Store the index of largest contour } } drawContours(newframe, contours, largest_contour_index, CV_RGB(255, 0, 0), CV_FILLED); circle(newframe, mc[largest_contour_index], 5, CV_RGB(255, 255, 0), -1, 8, 0); imshow("Detected", newframe); if (showchangedframe) imshow("Camera", frame); else imshow("Camera", rangeframe); } } void on_trackbar(int, void*) { if (kerode == 0) kerode = 1; if (kdilate == 0) kdilate = 1; } void createTrackbars() { String trackbarWindowName = "TrackBars"; namedWindow(trackbarWindowName, WINDOW_NORMAL); createTrackbar("l_MIN", trackbarWindowName, &l_MIN, l_MAX, on_trackbar); createTrackbar("l_MAX", trackbarWindowName, &l_MAX, l_MAX, on_trackbar); createTrackbar("a_MIN", trackbarWindowName, &a_MIN, a_MAX, on_trackbar); createTrackbar("a_MAX", trackbarWindowName, &a_MAX, a_MAX, on_trackbar); createTrackbar("b_MIN", trackbarWindowName, &b_MIN, b_MAX, on_trackbar); createTrackbar("b_MAX", trackbarWindowName, &b_MAX, b_MAX, on_trackbar); createTrackbar("Erosion", trackbarWindowName, &kerode, 31, on_trackbar); createTrackbar("Dilation", trackbarWindowName, &kdilate, 31, on_trackbar); } void morphit(Mat &img) { erode(img, img, getStructuringElement(MORPH_RECT, Size(kerode, kerode))); dilate(img, img, getStructuringElement(MORPH_RECT, Size(kdilate, kdilate))); } void toggle(int key) { if (key == 'r') showchangedframe = !showchangedframe; } 中显示)

答案 1 :(得分:1)

有两个选项

  • 两个批处理文件都在同一个cmd.exe实例中运行:为此,其中一个批处理文件正在等待另一个批处理文件结束,因此,没有任何对该变量的并发访问权限。

  • 每个批处理文件都在不同的cmd.exe实例中运行:每个实例都有自己的环境,因此,没有任何对该变量的并发访问权。

这意味着在同一时间内读取/写入相同变量没有任何问题,因为这不会发生。