Β cout << "evaluation time: " << (double)t / 1.E9
Β << " sec." << endl;
Β return EXIT_SUCCESS;
}ΠΠ΅ΡΠ΅Π΄ Π½Π°ΠΌΠΈ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠ°ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΡΠΈΡΠ°Π΅Ρ ΡΠ²ΠΎΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΈΠ·ΡΠ΅Π΄ΠΊΠ° Π΅Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅Ρ. ΠΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈΠΌΠΈΡΠΈΡΡΡΡΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°ΠΌΠΈ
delay(WRITE_DELAY)delay(READ_DELAY)ΠΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΊ Π΄Π°Π½Π½ΡΠΌ Π² ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ ( ΡΠ°ΠΉΠ» sy11.cc). ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ ΡΡΡΡΠΊΡΡΡΡ ΡΠΏΠΈΡΠΊΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ:
class dbase : public list<element> {
Β static const int READ_DELAY = 1, WRITE_DELAY = 2;
Β pthread_mutex_t loc;
public:
Β dbase(void) { pthread_mutex_init(&loc, NULL); }
Β ~dbase(void) { pthread_mutex_destroy(&loc); }
Β void add(const elements e) {
Β pthread_mutex_lock(&loc);
Β int pos = size() * rand() / RAND_MAX;
Β list<element>::iterator p = begin();
Β for (int i = 0; i < pos; i++) p++;
Β insert(p, e);
Β delay(WRITE_DELAY);
Β pthread_mutex_unlock(&loc);
Β }
Β int pos(const elements e) {
Β int n = 0;
Β pthread_mutex_lock(&loc);
Β for (list<element>::iterator i = begin(); i != end(); i++, n++)
Β Β if (*i == e) {
Β Β Β delay(READ_DELAY);
Β Β Β break;
Β Β }
Β pthread_mutex_unlock(&loc);
Β if (n == size()) n = -1;
Β return n;
Β }
} data;Π Π² Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠΈΠΊΠ» Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ Π΄Π°Π½Π½ΡΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ Π²:
pthread_t *h = new pthread_t[n];
uint64_t t = ClockCycles();
for (int i = 0; i < n; i++) {
Β element e = erand(n);
Β pthread_create(h + i, NULL, wrand(p) ? add : pos, (void*)e);
}
for (int i = 0; i < n; i++)
Β pthread_join(h[i], NULL);
t = ((ClockCycles() - t) * 1000000000) / cps;
delete h;Π ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΡΠΈΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΊΠ°ΠΊ:
static void* add(void* par) { data.add((element)par); }
static void* pos(void* par) { data.pos((element)par); }Π‘ΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΡ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ (ΠΈ ΠΊΡΠ΄Π° ΠΈΠ·ΡΠ΅Π΄ΠΊΠ° ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π½ΠΎΠ²ΡΠ΅), Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΡΠΈΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊ ΠΏΡΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΡΠ°ΠΊ ΠΈ ΠΏΡΠΈ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠΈ (Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΈΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Β«ΡΠΎ ΡΡΠΎΡΠΎΠ½ΡΒ»). ΠΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΌΡ ΡΠ΅ΡΠ΅ΡΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Ρ ΠΎΠ²Π°Π»ΠΈΡΡ: Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΡΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, Π½ΠΎ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°ΡΠΈΡΠ°ΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΎΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ( ΡΠ°ΠΉΠ» sy12.cc), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ, ΠΎΡΡΠ°Π²ΠΈΠ² Π²ΡΠ΅ ΠΏΡΠΎΡΠ΅Π΅ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:
class dbase : public list<element> {
Β static const int READ_DELAY = 1, WRITE_DELAY = 2;
Β pthread_rwlock_t loc;
public:
Β dbase(void) { pthread_rwlock_init(&loc, NULL); }
Β ~dbase(void) { pthread_rwlock_destroy(&loc); }
Β void add(const elements e) {
Β pthread_rwlock_wrlock(&loc);
Β int pos = size() * rand() / RAND_MAX;
Β list<element>::iterator p = begin();
Β for (int i = 0; i < pos; i++) p++;
Β insert(p, e);
Β delay(WRITE_DELAY);
Β pthread_rwlock_unlock(&loc);
Β }
Β int pos(const elements e) {
Β int n = 0;
Β pthread_rwlock_rdlock(&loc);
Β for (list<element>::iterator i = begin(); i != end(); i++, n++)
Β Β if (*i == e) {
Β Β Β delay(READ_DELAY);
Β Β Β break;
Β Β }
Β pthread_rwlock_unlock(&loc);
Β if (n == size()) n = -1;
Β return n;
Β }
} data;Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΡΠ»ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΠ°Π²Π½ΠΈΡΡ Π²Π°ΡΠΈΠ°Π½ΡΡ:
# nice -n-19 sy10 500 .2
evaluation time: 1.2296 sec.
# nice -n-19 sy11 500 .2
evaluation time: 1.24973 sec.
# nice -n-19 sy12 500 .2
evaluation time: 0.440904 sec.ΠΡΠΈ Β«ΠΆΠ΅ΡΡΠΊΠΎΠΉΒ» Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅ ΠΌΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²ΡΠΈΠ³ΡΡΡΠ° Π·Π° ΡΡΠ΅Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ Π΄Π°Π½Π½ΡΠΌ, Π° ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ β 3-ΠΊΡΠ°ΡΠ½ΡΠΉ Π²ΡΠΈΠ³ΡΡΡ. ΠΡΠΎΠ΄Π΅Π»Π°Π΅ΠΌ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, Π½ΠΎ Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ²:
# nice -n-19 sy10 500 .02