��� ������ 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 � �������� �����
�������� ������� ������ ���� � �������?
... ������ ���� ����� ������� ��� �������, ����� ��� ��������.
02 Jul 09 , 09:13 Dmitry E. Oboukhov ����� � All:
DEO> ������ ��� ��������� ����� ��� rd � ��������� wr � �������� �����
DEO> �������� ������� ������ ���� � �������?
����� ��� ������ ����?
�������� ������: �����, �����, �����������
�������� ������: �����, ������, �����������
� ����� ������� ���� �������� �� �������, �� ������ �� ������, � �ģ�
������������.
. � ���������, H�����.
icq:240059686, lj-user:nicka_startcev
... ������� ������
NAS> ����� ��� ������ ����?
NAS> �������� ������: �����, �����, �����������
NAS> �������� ������: �����, ������, �����������
NAS> � ����� ������� ���� �������� �� �������, �� ������ �� ������, � �ģ�
NAS> ������������.
��� ����� ��������� ������������������ ���������� �������
��� ������ ��� ����� ������ ���� �������.
� ������ �� rwlock'� ������� ������� ����� ���� ������ ����, � ���
�������� ������������ ������� ������. � ��� ������ �����������
������������ ������� �� �������� ���������� ������� �����������
�� ��������.
��������� ������ �� "����� ��������" � "����� �������" � � ���������
�� ����, �� ������� ������� ������ ���� ����������� � � ���� ������ ��
������ ��� :)
... ���������� - ��������� ���� ��� ����� � ������� �����.
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!
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!
... � ���� ������� ������ �� �������!
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
... �������� ������ ������� ��������
... ������������ ������� ����� �� ��� ���������� �������: "�� � �� ��������"
03 Jul 09 , 22:07 Dmitry E. Oboukhov ����� � Nickita A Startcev:
DEO> � �� ���� �� pthreads �������, �� ���� ��� ���� ���� ������. ��� �����
DEO> ��� ���� ����� ������� � �������������/������������?
� ��. � �� ������� � ������ ������ ������� � ����������� �� ��.
������, �����, ��� �� ���� ���������� ������������ ���� �����.
. � ���������, H�����.
icq:240059686, lj-user:nicka_startcev
... ��������� ����������� ����������� �� �������
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!
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>
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���������� ��������
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>