查找C ++中多个线程之间的内存冲突
假设我们有一个RAM,并且RAM是按块组织的。系统上正在运行多个进程。我们必须记住,每个进程都会获得以下信息(线程T,内存块M,时间t,R/W),这表明线程T在给定的时间t正在实现内存块M,并且操作可以是read(R)或写(W)。
以下情况表明是否是内存冲突-
在同一位置进行多个读取操作不是冲突的原因。
当在x+5到x-5之间对M的位置执行写入操作时,它将负责在时间x(其中x称为某个时间)处为线程访问位置M造成线程冲突。
因此,如果线程T1在时间x+1访问了内存位置M,而线程T2在时间x+6之前访问了内存M,那么当T1和T2中的一个进行写操作时,它们就会发生冲突。
如果我们有访问内存位置的线程列表。我们必须找到所有冲突。
因此,如果输入类似于[[(1,932,1,R),(2,512,2,W),(3,932,3,R),(4,512,4,R),(5,432,5,R),(6,512,6,R),(7,835,7,W),(8,432,8,R)],则输出将为冲突线程(2,4)和(2,6),其他所有操作都相同。
为了解决这个问题,我们将遵循以下步骤-
使用id,memory_block,时间和操作创建线程
根据存储块对数组th_arr进行排序,当存储块相同时使用时间。
对于初始化i:=1,当i−n,更新(i增加1)时,-
如果th_arr[i].time<=th_arr[i-1].time+5,则-
如果th_arr[i].operation与'W'相同或th_arr[j].operation与'W'相同,则-
(将j减1)
显示冲突的线程th_arr[j]和th_arr[i]
j:=i-1
而(th_arr[i].memory_block与th_arr[j].memory_block和th_arr[i].time<=th_arr[j].time+5并且j>=0相同),执行-
如果th_arr[i].memory_block与th_arr[i-1].memory_block相同,则-
范例(C++)
让我们看下面的实现以更好地理解-
#include<bits/stdc++.h>
using namespace std;
class Thread {
public:
int id, memory_block, time;
char operation;
};
bool compare(const Thread& x, const Thread& y) {
if (x.memory_block == y.memory_block)
return x.time < y.time;
else return x.memory_block < y.memory_block;
}
void display_conflicts(Thread th_arr[], int n) {
sort(th_arr, th_arr+n, compare);
for (int i = 1; i < n; i++) {
if(th_arr[i].memory_block == th_arr[i-1].memory_block) {
if (th_arr[i].time <= th_arr[i-1].time+5) {
int j = i-1;
while (th_arr[i].memory_block == th_arr[j].memory_block && th_arr[i].time <= th_arr[j].time+5 && j >= 0) {
if (th_arr[i].operation == 'W' || th_arr[j].operation == 'W') {
cout << "Conflicting threads [" << th_arr[j].id << ", " << th_arr[i].id << "]\n";
}
j--;
}
}
}
}
}
int main() {
Thread th_arr[] = {{1, 932, 1, 'R'},{2, 512, 2, 'W'},{3, 932, 3, 'R'}, {4, 512, 4, 'R'},{5, 432, 5, 'R'}, {6, 512, 6, 'R'},{7, 835, 7, 'W'}, {8, 432, 8, 'R'}};
int n = sizeof(th_arr)/sizeof(th_arr[0]);
display_conflicts(th_arr, n);
}输入值
{{1, 932, 1, 'R'},{2, 512, 2, 'W'},{3, 932, 3, 'R'}, {4, 512, 4,
'R'},{5, 432, 5, 'R'}, {6, 512, 6, 'R'},{7, 835, 7, 'W'}, {8, 432, 8,
'R'}}输出结果
Conflicting threads [2, 4] Conflicting threads [2, 6]