Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

pthreads rd/wr lock'и

6 views
Skip to first unread message

Dmitry E. Oboukhov

unread,
Jul 2, 2009, 12:13:44 AM7/2/09
to
������� ��������� � ����� ����������� ����� �������� ������.
������� rw �������.

��� ������ 99% ������� ����� rd'���, ������ ���� ������ ���-�� ������
� ��������� ���..

�� ���� ��� �������� ���:

pthread_rwlock_rdlock(&lock);
... ���
... [1]
pthread_rwlock_unlock(&lock);

����� �����-�� ����� ����� ������ �� ����������� ������ ��������������
������. ��� ����� �� ������ ����� wr'��� � ����� [1] �������.

������ �������� ���

pthread_rwlock_rdlock(&lock);
... ���
pthread_rwlock_unlock(&lock); // [2.1]
pthread_rwlock_wrlock(&lock); // [2.2]

... ���, �������������� ������
pthread_rwlock_unlock(&lock);

� �������� ���������� ����� ���, �� ��� �� �������� �� ��� �����-��
����� ��� ����������� ������. �� ���� ����� ��������� ����� � �����-��
����������� ����� [2.1] � [2.2]

� ����� �� ��� ���� ���� �� ��������������� ��������, �� ����������
������� �� �����.

������ ��� ��������� ����� ��� rd � ��������� wr � �������� �����
�������� ������� ������ ���� � �������?

... ������ ���� ����� ������� ��� �������, ����� ��� ��������.

Nickita A Startcev

unread,
Jul 2, 2009, 11:11:48 AM7/2/09
to
������, Dmitry !


02 Jul 09 , 09:13 Dmitry E. Oboukhov ����� � All:

DEO> ������ ��� ��������� ����� ��� rd � ��������� wr � �������� �����
DEO> �������� ������� ������ ���� � �������?

����� ��� ������ ����?

�������� ������: �����, �����, �����������
�������� ������: �����, ������, �����������
� ����� ������� ���� �������� �� �������, �� ������ �� ������, � �ģ�
������������.

. � ���������, H�����.
icq:240059686, lj-user:nicka_startcev
... ������� ������

Dmitry E. Oboukhov

unread,
Jul 3, 2009, 2:58:34 AM7/3/09
to
DEO>> ������ ��� ��������� ����� ��� rd � ��������� wr � �������� �����
DEO>> �������� ������� ������ ���� � �������?

NAS> ����� ��� ������ ����?

NAS> �������� ������: �����, �����, �����������
NAS> �������� ������: �����, ������, �����������
NAS> � ����� ������� ���� �������� �� �������, �� ������ �� ������, � �ģ�
NAS> ������������.

��� ����� ��������� ������������������ ���������� �������
��� ������ ��� ����� ������ ���� �������.

� ������ �� rwlock'� ������� ������� ����� ���� ������ ����, � ���
�������� ������������ ������� ������. � ��� ������ �����������
������������ ������� �� �������� ���������� ������� �����������
�� ��������.

��������� ������ �� "����� ��������" � "����� �������" � � ���������
�� ����, �� ������� ������� ������ ���� ����������� � � ���� ������ ��
������ ��� :)

... ���������� - ��������� ���� ��� ����� � ������� �����.

Andrey Troitsky

unread,
Jul 3, 2009, 8:37:10 AM7/3/09
to
������ Dmitry! ����� ���� Andrey!

Thu, 02 Jul 2009 09:13, Dmitry E. Oboukhov => All:


DO> ������� ��������� � ����� ����������� ����� �������� ������.
DO> ������� rw �������.

DO> ��� ������ 99% ������� ����� rd'���, ������ ���� ������ ���-�� ������
DO> � ��������� ���..

DO> �� ���� ��� �������� ���:

DO> pthread_rwlock_rdlock(&lock);
DO> ... ���
DO> ... [1]
DO> pthread_rwlock_unlock(&lock);

DO> ����� �����-�� ����� ����� ������ �� ����������� ������ ��������������
DO> ������. ��� ����� �� ������ ����� wr'��� � ����� [1] �������.

H� ������ �����, ���� �p��� �������� p���p� ����������, �� ����� ����� ���
�������
����� �����, ���� ���� �������� �����p������ ���� read �p����, � ����� � ������
���� ���������� ������������� ������� write - �� ��� "�������" ���������
��������? ���� ��, �� ��� ����� ���� ���� �� �������� � ����������� ���������
�p��� � �������� ����� ��� �p��p���� ���� ���p����. ���� ���:


DWORD count_threads=0;

BOOL flag_want_write=0;//���� ����� �� ����� ������ (��p������� ����p���������)
HMUTEX mutex_flag_want_write=CreateMutex(0,0,0);//������ �� ������ �
flag_want_write

HEVENT event_can_read=CreateEvent(0,1,1,0);//���������� p����, �p���������,
�.�. ������ �����
HEVENT event_can_write=CreateEvent(0,1,0,0);//���������� p����, ���p���������,
�.�. ������ ������

thread_proc()
{

//����, ����� ����� ������
wait_event(event_can_read)

//�������, ������� ����� �������� �p����
count_threads++;

//
//��� ������
//

//���� ���� ��������
if(check_need_write()=YES)
{open_mutex(mutex_flag_want_write)

//����� ��� ������� ������, ������
if(flag_want_write==1)
{ release_mutex(mutex_flag_want_write)
count_threads--;
//���� �p����������� �p��
if(count_threads==1) set_event(event_can_write);
return;
}

flag_want_write=1;//�ӣ, ���� �p�� ����� ������
release_mutex(mutex_flag_want_write)
unset_event(event_can_read)//�ӣ, ����� �������� �� ��������

}else
//��������, ������ �� ����, �������
{count_threads--;
//���� �p����������� �p��
if(flag_want_write && count_threads==1) set_event(event_can_write)
return;
}


//����, ����� �p��p���� ������ ��� ��������
wait_event(event_can_write)

//
//���� ����� ��� ��� ����
//

//�p����� ��p������� �������
unset_event(event_can_write)

count_threads--;
flag_want_write=0;
//������ �����, ��� ����� ������
set_event(event_can_read)


}

�� ����,
�p���� �� ���p�� ��� count_threads ����p�����p������ �����, ���� ��������

�� � ����� ��� ������... ���� Dmitry!

Dmitry E. Oboukhov

unread,
Jul 3, 2009, 3:23:57 AM7/3/09
to
DO>> ������� ��������� � ����� ����������� ����� �������� ������.
DO>> ������� rw �������.

DO>> ��� ������ 99% ������� ����� rd'���, ������ ���� ������ ���-�� ������
DO>> � ��������� ���..

DO>> �� ���� ��� �������� ���:

DO>> pthread_rwlock_rdlock(&lock);
DO>> ... ���
DO>> ... [1]
DO>> pthread_rwlock_unlock(&lock);

DO>> ����� �����-�� ����� ����� ������ �� ����������� ������ ��������������
DO>> ������. ��� ����� �� ������ ����� wr'��� � ����� [1] �������.

AT> H� ������ �����, ���� �p��� �������� p���p� ����������, �� ����� ����� ���
AT> �������

����� ������ ������ ��� ������.
� ������ ����� ������ ����.
������ ������ - ������ ��������, �� ���������� ����� � ��� ���� ����
���������

AT> ����� �����, ���� ���� �������� �����p������ ���� read �p����, � ����� �
AT> ������ ���� ���������� ������������� ������� write - �� ��� "�������"
AT> ��������� ��������? ���� ��, �� ��� ����� ���� ���� �� �������� �
AT> ����������� ��������� �p��� � �������� ����� ��� �p��p���� ���� ���p����.
AT> ���� ���:

AT> DWORD count_threads=0;

AT> BOOL flag_want_write=0;//���� ����� �� ����� ������ (��p�������
AT> ����p���������)
AT> HMUTEX mutex_flag_want_write=CreateMutex(0,0,0);//������ �� ������ �
AT> flag_want_write

AT> HEVENT event_can_read=CreateEvent(0,1,1,0);//���������� p����, �p���������,
AT> �.�. ������ �����
AT> HEVENT event_can_write=CreateEvent(0,1,0,0);//���������� p����,
AT> ���p���������, �.�. ������ ������

AT> thread_proc()
AT> {

AT> //����, ����� ����� ������
AT> wait_event(event_can_read)
��� �� ��� ��� ������: ����� ������ �� �, � ����� ����������, �������
��� �������� � ������ ������ ��������.

AT> //�������, ������� ����� �������� �p����
AT> count_threads++;
// ��� ������ atomic �����, DWORD �� ����� ��������

AT> //
AT> //��� ������
AT> //

AT> //���� ���� ��������
AT> if(check_need_write()=YES)
AT> {open_mutex(mutex_flag_want_write)

AT> //����� ��� ������� ������, ������
AT> if(flag_want_write==1)
AT> { release_mutex(mutex_flag_want_write)
AT> count_threads--;
AT> //���� �p����������� �p��
AT> if(count_threads==1) set_event(event_can_write);
AT> return;
AT> }
���� ������ ��� ����� ���� ������, ������� �� �� ����.
���� � ����� ������� ������ ������, �� ������ ����� ���� ��� ���������
�������. � ���� ��� ����� �� ������ ���� �� ������, �� ����������
deadlock ����� ����� �����������.

AT> flag_want_write=1;//�ӣ, ���� �p�� ����� ������
AT> release_mutex(mutex_flag_want_write)
AT> unset_event(event_can_read)//�ӣ, ����� �������� �� ��������

AT> }else
AT> //��������, ������ �� ����, �������
AT> {count_threads--;
AT> //���� �p����������� �p��
AT> if(flag_want_write && count_threads==1) set_event(event_can_write)
AT> return;
AT> }

AT> //����, ����� �p��p���� ������ ��� ��������
AT> wait_event(event_can_write)

AT> //
AT> //���� ����� ��� ��� ����
AT> //

AT> //�p����� ��p������� �������
AT> unset_event(event_can_write)

AT> count_threads--;
AT> flag_want_write=0;
AT> //������ �����, ��� ����� ������
AT> set_event(event_can_read)

AT> }

AT> �� ����,
AT> �p���� �� ���p�� ��� count_threads ����p�����p������ �����, ���� ��������

AT> H� � ����� ��� ������... ���� Dmitry!

... � ���� ������� ������ �� �������!

Nickita A Startcev

unread,
Jul 3, 2009, 9:38:12 AM7/3/09
to
������, Dmitry !


03 Jul 09 , 11:58 Dmitry E. Oboukhov ����� � Nickita A Startcev:

NAS>> ����� ��� ������ ����?

NAS>> �������� ������: �����, �����, �����������
NAS>> �������� ������: �����, ������, �����������
NAS>> � ����� ������� ���� �������� �� �������, �� ������ �� ������, �

NAS>> �ģ� ������������.

DEO> ��� ����� ��������� ������������������ ���������� �������
DEO> ��� ������ ��� ����� ������ ���� �������.

�����, ����������, � ��� ���� ��� ���������, ����� �������� ���� ����������
��������:
- ��������
- ���-�� ������
- ���-�� �����.
��������������, ���� ��� ��������� ����������� ����������, ��� ��� �����-��
�������.

��� �������. ������ �������� ���������� ����� "����������", ���������� �� �
���������
��������(0), ������ N+1 �������(N+1), ����� ���-�� (-1).

��������:
1.�����, �������, ���� ����� ������ - ��������������, �����������.
2.������.
3.�����, ��������������, �����������.
0. ���� �������� - �� ����������.
0. ���� ������ ����� (�����) - �� ���������� �����-������ sleep(0).

��������:
1.�����, �������. ���� 0 ���������, �� ��������� � ��������� '�����', �����
����������.
2. �����
3. �����������

��� ���������: ��� ������ ������ �������� ����� ����������� ������������ ��
�����������.

. � ���������, H�����.
icq:240059686, lj-user:nicka_startcev

... �������� ������ ������� ��������

Dmitry E. Oboukhov

unread,
Jul 3, 2009, 1:07:09 PM7/3/09
to
� �� ���� �� pthreads �������, �� ���� ��� ���� ���� ������. ��� �����
��� ���� ����� ������� � �������������/������������?

... ������������ ������� ����� �� ��� ���������� �������: "�� � �� ��������"

Nickita A Startcev

unread,
Jul 3, 2009, 3:24:08 PM7/3/09
to
������, Dmitry !


03 Jul 09 , 22:07 Dmitry E. Oboukhov ����� � Nickita A Startcev:

DEO> � �� ���� �� pthreads �������, �� ���� ��� ���� ���� ������. ��� �����
DEO> ��� ���� ����� ������� � �������������/������������?

� ��. � �� ������� � ������ ������ ������� � ����������� �� ��.
������, �����, ��� �� ���� ���������� ������������ ���� �����.

. � ���������, H�����.
icq:240059686, lj-user:nicka_startcev

... ��������� ����������� ����������� �� �������

Andrey Troitsky

unread,
Jul 5, 2009, 3:24:40 AM7/5/09
to
������ Dmitry! ����� ���� Andrey!

Fri, 03 Jul 2009 12:23, Dmitry E. Oboukhov => Andrey Troitsky:

AT>> H� ������ �����, ���� �p��� �������� p���p� ����������, �� �����
AT>> ����� ��� �������

DO> ����� ������ ������ ��� ������.
DO> � ������ ����� ������ ����.
DO> ������ ������ - ������ ��������, �� ���������� ����� � ��� ���� ����
DO> ���������
��, ������ ������������� - ������ �� ����.


AT>> ����� �����, ���� ���� �������� �����p������ ���� read �p����, �
AT>> ����� � ������ ���� ���������� ������������� ������� write - ��
AT>> ��� "�������" ��������� ��������? ���� ��, �� ��� ����� ���� ����
AT>> �� �������� � ����������� ��������� �p��� � �������� ����� ���

AT>> �p��p���� ���� ���p����. ���� ���:

AT>> DWORD count_threads=0;

AT>> BOOL flag_want_write=0;//���� ����� �� ����� ������ (��p�������

AT>> ����p���������) HMUTEX
AT>> mutex_flag_want_write=CreateMutex(0,0,0);//������ �� ������ �
AT>> flag_want_write

AT>> HEVENT event_can_read=CreateEvent(0,1,1,0);//���������� p����,

AT>> �p���������, �.�. ������ ����� HEVENT
AT>> event_can_write=CreateEvent(0,1,0,0);//���������� p����,


AT>> ���p���������, �.�. ������ ������


AT>> thread_proc()
AT>> {

������� � ������ ������� ����� �p����:

BOOL __thread flag_this_wait_to_write;//������,��� ������ ���� ��������

flag_this_wait_to_write=0;
//����� ��� �p����, ����p�� ���������� ������, ����� ��� ���� ������
thread_proc_start:


AT>> //����, ����� ����� ������
AT>> wait_event(event_can_read)

DO> ��� �� ��� ��� ������: ����� ������ �� �, � ����� ����������, �������
DO> ��� �������� � ������ ������ ��������.
������-�� ��� p������ - ����� �� ��� ������� ���������� ����� ������� ���
������ ��������, ���������� �� ������. H������ �� �� thread_proc �
my_callback_for_threads. :)

AT>> //�������, ������� ����� �������� �p����
AT>> count_threads++;

DO> // ��� ������ atomic �����, DWORD �� ����� ��������
��� ��.


AT>> //
AT>> //��� ������
AT>> //

AT>> //���� ���� ��������
AT>> if(check_need_write()=YES)
AT>> {open_mutex(mutex_flag_want_write)

AT>> //����� ��� ������� ������, ������
AT>> if(flag_want_write==1)
AT>> { release_mutex(mutex_flag_want_write)
AT>> count_threads--;
AT>> //���� �p����������� �p��
AT>> if(count_threads==1) set_event(event_can_write);
AT>> return;
AT>> }

DO> ���� ������ ��� ����� ���� ������, ������� �� �� ����.
DO> ���� � ����� ������� ������ ������, �� ������ ����� ���� ��� ���������
DO> �������. � ���� ��� ����� �� ������ ���� �� ������, �� ����������
DO> deadlock ����� ����� �����������.
������ ��� ����� �p���� ������ �����:
if(flag_want_write==1)
{flag_this_wait_to_write=1;
count_threads--;
goto thread_proc_start;


}
AT>> flag_want_write=1;//�ӣ, ���� �p�� ����� ������
AT>> release_mutex(mutex_flag_want_write)
AT>> unset_event(event_can_read)//�ӣ, ����� �������� �� ��������

AT>> }else
AT>> //��������, ������ �� ����, �������
AT>> {count_threads--;
AT>> //���� �p����������� �p��
AT>> if(flag_want_write && count_threads==1) set_event(event_can_write)
AT>> return;
AT>> }

DO> --- Mutt/1.5.18 (2008-05-17)
DO> * Origin: Debian GNU Linux (2:5020/830.100)

�� � ����� ��� ������... ���� Dmitry!

Serguei E. Leontiev

unread,
Sep 8, 2009, 2:31:27 PM9/8/09
to
������������, Dmitry,
�� ������ � Nickita A Startcev �� Fri, 03 Jul 2009 21:07:09 +0400:

DEO>>> pthread_rwlock_rdlock(&lock);
DEO>>> ... ���
DEO>>> pthread_rwlock_unlock(&lock); // [2.1]
DEO>>> pthread_rwlock_wrlock(&lock); // [2.2]
DEO>>> ... ���, �������������� ������
DEO>>> pthread_rwlock_unlock(&lock);

DEO>>> � �������� ���������� ����� ���, �� ��� �� �������� �� ��� �����-��
DEO>>> ����� ��� ����������� ������. �� ���� ����� ��������� ����� �
�����-��
DEO>>> ����������� ����� [2.1] � [2.2]

���� ��� �����, �.�. ���� "volatile" ����������, ���������� � ������� "...
���", �� ������������ � ������� "... ���, �������������� ������". �� �
�������� ���, ��� ������� ����� �������� �� ��� ����� (��� �������), ��� ��
�� � ���������. ����, ��������, ������� lookup() - ������ ��������, �
insert() - ��������.

DEO> � �� ���� �� pthreads �������, �� ���� ��� ���� ���� ������. ��� �����
DEO> ��� ���� ����� ������� � �������������/������������?

�� POSIX - <http://www.opengroup.org/austin/defectform.html>, �.�. LSB
��������� ������� �������, �� www.lsb.org ���� ���� bugzilla.

H� ���� ������, � ���� ������, ��� �� ������ ��� (� 1997 ����) ��� ��������
� ����� ������������, � ��������. � �����, ��� �� ������� "��� ������
�����", ������� ������ ����� ������� ������������, ��� "�������� ����������"
� �.�. ���� ����������, ��� ������ ������, �� ������������ ��, ����
AIX/Solaris/VxWorks �������� ������������ �� ������ �������. ���, ���
"GNU/Linux-������" ����� � ���������� � ��������� ������ LSB, � �����,
�������, � �� POSIX ���������.

H�, � ��� �� � ������ RU.CPP, �� ���� ������������ ���������� BOOST � �����
���������� Thread, ������� �������� ������ (������ ������������ �����)
���������� ��� pthread_*(), � ��� ������� ���������� shared_lock �
������������ "��������/����������". ���� � ���� ��������� ���������� � ���
��� "�������� ����������" �� ���� ������, �� ��� �� �������.

����� �� ������������, ��� C++ �������, ������ ������������� (�������������
� ����������), �����������, ��� ���� :)

--
�������, ������ ��������. E-mail: l...@cryptopro.ru <http://www.cryptopro.ru>


Dmitry E. Oboukhov

unread,
Sep 8, 2009, 2:12:18 PM9/8/09
to
DEO>>>> pthread_rwlock_rdlock(&lock);
DEO>>>> ... ���
DEO>>>> pthread_rwlock_unlock(&lock); // [2.1]
DEO>>>> pthread_rwlock_wrlock(&lock); // [2.2]
DEO>>>> ... ���, �������������� ������
DEO>>>> pthread_rwlock_unlock(&lock);

DEO>>>> � �������� ���������� ����� ���, �� ��� �� �������� �� ��� �����-��
DEO>>>> ����� ��� ����������� ������. �� ���� ����� ��������� ����� �

SEL> �����-��
DEO>>>> ����������� ����� [2.1] � [2.2]

SEL> ���� ��� �����, �.�. ���� "volatile" ����������, ���������� � ������� "...
SEL> ���", �� ������������ � ������� "... ���, �������������� ������". �� �
SEL> �������� ���, ��� ������� ����� �������� �� ��� ����� (��� �������), ���
SEL> ��
SEL> �� � ���������. ����, ��������, ������� lookup() - ������ ��������, �
SEL> insert() - ��������.

������������. ������� � �������
... ���, �������������� ������
�������� ������� ��� ���� �������� � ������������� �� ��� ����������
���. � ����� ��������, � �� ���� � ����������� ���� :)


SEL> H�, � ��� �� � ������ RU.CPP, �� ���� ������������ ���������� BOOST �
SEL> �����
SEL> ���������� Thread, ������� �������� ������ (������ ������������ �����)
SEL> ���������� ��� pthread_*(), � ��� ������� ���������� shared_lock �
SEL> ������������ "��������/����������". ���� � ���� ��������� ���������� � ���
SEL> ��� "�������� ����������" �� ���� ������, �� ��� �� �������.

SEL> ����� �� ������������, ��� C++ �������, ������ �������������
SEL> (�������������
SEL> � ����������), �����������, ��� ���� :)

� ��� ��� ���������. ����������� �������, �������!

... ���� ������� �� ��������� ����� ��������, �� �� ������� �������� ��������
��� H���������� ��������

Serguei E. Leontiev

unread,
Sep 8, 2009, 4:39:50 PM9/8/09
to
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ Dmitry,

Dmitry E. Oboukhov -> Serguei E. Leontiev @ О©╫О©╫ 8-О©╫О©╫О©╫-09 22:12 MSD:

DEO> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫
DEO> ... О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
DEO> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
DEO> О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ :)

О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.

P.S.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫:

pthread_rdlock()
О©╫О©╫О©╫О©╫О©╫
sgen = generation;
pthread_unlock()
pthread_wrlock()
if(sgen != genertion){
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
}
generation++
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
pthread_unlock()

--
О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. E-mail: l...@CryptoPro.ru <http://www.cryptopro.ru>

0 new messages