Re[6]: Почему .Net-версия жестко виснет, а C++ - нет?
От: Fortnum  
Дата: 17.05.15 12:31
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Посмотрел еще раз. А что, собственно говоря, ты хочешь сделать ?

PD>Locks the specified file for exclusive access by the calling process.
PD>https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203%28v=vs.85%29.aspx
PD>Функция блокирует регион файла для процесса. При чем тут потоки одного процесса ?

А действительно!..

PD>И оттуда же

PD>Exclusive locks cannot overlap an existing locked region of a file
PD>А ты именно это и делаешь.
PD>В общем, распечатай результат LockFileEx и при false распечатай GetLastError.

Вот так изменил MyProc, время нахождения в lock'е увеличил до секунды, чтобы потоки наверняка пересекались... и, блин, оно заработало! Возвращает TRUE, хотя работать-то, получается, не должно? Ничего не понимаю

static void MyProc()
{
    for (int i = 0; i < int.MaxValue; i++)
    {
        Console.WriteLine(i);

        var _overlapped = new NativeOverlapped();

        var r1 = LockFileEx(_handle, LOCKFILE_EXCLUSIVE_LOCK, 0, int.MaxValue, int.MaxValue, ref _overlapped);

        Console.WriteLine("{0}>r1={1}", Thread.CurrentThread.ManagedThreadId, r1);

        Thread.Sleep(1000);

        var r2 = UnlockFileEx(_handle, 0, int.MaxValue, int.MaxValue, ref _overlapped);

        Console.WriteLine("{0}>r2={1}", Thread.CurrentThread.ManagedThreadId, r2);
    }
}


Результат:

0
0
3>r1=True
3>r2=True
1
4>r1=True
4>r2=True
1
3>r1=True
3>r2=True
2
4>r1=True
4>r2=True
2
3>r1=True
3>r2=True
3
4>r1=True
4>r2=True
3
3>r1=True
3>r2=True
4
4>r1=True
4>r2=True
4
3>r1=True
3>r2=True
5
4>r1=True
4>r2=True
5
3>r1=True
3>r2=True
6
4>r1=True
4>r2=True
6
3>r1=True
3>r2=True
7
4>r1=True
4>r2=True
7
3>r1=True
3>r2=True
8
4>r1=True
4>r2=True
8
3>r1=True
3>r2=True
9
4>r1=True
4>r2=True
9
3>r1=True
3>r2=True
10
4>r1=True
4>r2=True
10
3>r1=True
3>r2=True
11
4>r1=True
4>r2=True
11
3>r1=True
3>r2=True
12
4>r1=True
4>r2=True
12
3>r1=True
3>r2=True
13
4>r1=True
4>r2=True
13
3>r1=True
3>r2=True
14
4>r1=True
4>r2=True
14
3>r1=True
3>r2=True
15
4>r1=True
4>r2=True
15
3>r1=True
3>r2=True
16
4>r1=True
4>r2=True
16
3>r1=True
3>r2=True
17
4>r1=True
4>r2=True
17
3>r1=True
3>r2=True
18
4>r1=True
4>r2=True
18
3>r1=True
3>r2=True
19
4>r1=True
4>r2=True
19
3>r1=True
3>r2=True
20
4>r1=True
4>r2=True
20
3>r1=True
3>r2=True
21
4>r1=True
4>r2=True
21
3>r1=True
3>r2=True
22
4>r1=True
4>r2=True
22
3>r1=True
3>r2=True
23
4>r1=True
4>r2=True
23
3>r1=True
3>r2=True
24
4>r1=True
4>r2=True
24
3>r1=True
3>r2=True
25
4>r1=True
4>r2=True
3>r1=True
25
3>r2=True
26
4>r1=True
4>r2=True
26
3>r1=True
3>r2=True
27
4>r1=True
4>r2=True
27
3>r1=True
3>r2=True
28
4>r1=True
4>r2=True
28
3>r1=True
3>r2=True
29
4>r1=True
4>r2=True
29
3>r1=True
3>r2=True
30
4>r1=True
4>r2=True
30
3>r1=True
3>r2=True
31
4>r1=True
4>r2=True
31
3>r1=True
3>r2=True
32
4>r1=True
4>r2=True
32
3>r1=True
3>r2=True
33
4>r1=True
4>r2=True
33
3>r1=True
3>r2=True
34
4>r1=True
4>r2=True
34
3>r1=True

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.