关于多线程锁:锁代码还是锁资源?# Programming - 葵花宝典
p*y
1 楼
有一个多线程的问题,我困惑了好久。多线程的mutex锁,是锁资源还是锁代码?
举个例子 我有100个文件存在磁盘上,分别命名为1.txt, 2.txt, 3.txt ...... 100.
txt.
现在我要创建多个线程,去往文件存东西。举例子如下(C++)。
mutex mx;
void write_to_file(string filename, string binary_data)
{
unique_lock lk(mx);
fstream f(filename);
f.write(&(binary_data[0]), binary_data.size());
f.close();
}
这段代码看似没有问题,但是却有个缺陷:锁的是代码,并非资源。换句话说,在多线
程下,任何
一个线程都会被另外一个线程block住,因为这里只要有两个线程同时碰到这个锁,就
会出现锁问题。
这时的多线程毫无意义了,因为这个函数其实无法并行。
可问题是,我往一个文件1.txt里面写东西,不应该影响另外一个线程往2.txt里面写东
西。
所以是不是应该锁资源,而不是锁代码?
如果是这样就应该这么写
//把文件名和mutex创建map,每个文件名都有一个独立的mutex
map mx_map;
void write_to_file(string filename, string binary_data)
{
unique_lock lk(mx_map[filename]);
fstream f(filename);
f.write(&(binary_data[0]), binary_data.size());
f.close();
}
这样,锁就是对应于某一个文件。多个线程的锁并不一定一致,也就不一定冲突。
请问诸位高人,我说的有道理么?
举个例子 我有100个文件存在磁盘上,分别命名为1.txt, 2.txt, 3.txt ...... 100.
txt.
现在我要创建多个线程,去往文件存东西。举例子如下(C++)。
mutex mx;
void write_to_file(string filename, string binary_data)
{
unique_lock
fstream f(filename);
f.write(&(binary_data[0]), binary_data.size());
f.close();
}
这段代码看似没有问题,但是却有个缺陷:锁的是代码,并非资源。换句话说,在多线
程下,任何
一个线程都会被另外一个线程block住,因为这里只要有两个线程同时碰到这个锁,就
会出现锁问题。
这时的多线程毫无意义了,因为这个函数其实无法并行。
可问题是,我往一个文件1.txt里面写东西,不应该影响另外一个线程往2.txt里面写东
西。
所以是不是应该锁资源,而不是锁代码?
如果是这样就应该这么写
//把文件名和mutex创建map,每个文件名都有一个独立的mutex
map
void write_to_file(string filename, string binary_data)
{
unique_lock
fstream f(filename);
f.write(&(binary_data[0]), binary_data.size());
f.close();
}
这样,锁就是对应于某一个文件。多个线程的锁并不一定一致,也就不一定冲突。
请问诸位高人,我说的有道理么?