Производительность pthread_spinlock_t в 2 раза выше, чем моя собственная реализация со свободным от блокировки std::atom ⇐ C++
-
Гость
Производительность pthread_spinlock_t в 2 раза выше, чем моя собственная реализация со свободным от блокировки std::atom
Я хотел заменить пример pthread_spinlock_t своей собственной реализацией спин-блокировки. Однако результат моей реализации буквально намного ниже, чем производительность pthread_spinlock_t. Хотя результат pthread_spinlock_t составляет около 0,9 с, моя собственная реализация занимает около 2,4 с. Может ли кто-нибудь объяснить, чего не хватает в моей реализации или какие еще возможности для улучшения? Я считаю, что мне не хватает чего-то, связанного с упорядочиванием памяти. Вот моя реализация ниже
#include #include #include #include #include #include #include #include #define ПЕТЛИ 10000000 использование пространства имен std; список the_list; //pthread_spinlock_t спинблокировка; std::atomic_flag флаг = ATOMIC_FLAG_INIT; pid_t gettid() { return syscall( __NR_gettid ); } void *consumer(void *ptr) { printf("Потребительский TID %lu\n", (unsigned long)gettid()); пока (1) { //pthread_spin_lock(&spinlock); while (flag.test_and_set(std::memory_order_acquire)); если (the_list.empty()) { //pthread_spin_unlock(&spinlock); flag.clear(std::memory_order_release); перерыв; } the_list.front(); the_list.pop_front(); //pthread_spin_unlock(&spinlock); flag.clear(std::memory_order_release); } вернуть НУЛЬ; } интервал основной() { интервал я; pthread_t thr1, thr2; структура timeval tv1, tv2; //pthread_spin_init(&spinlock, 0); // Создание содержимого списка... для (я = 0; я tv2.tv_usec) { tv2.tv_sec--; tv2.tv_usec += 1000000; } printf("Результат - %ld.%ld\n", tv2.tv_sec - tv1.tv_sec, tv2.tv_usec - tv1.tv_usec); //pthread_spin_destroy(&spinlock); вернуть 0; } Я ожидал добиться производительности pthread_spin с помощью своей собственной реализации
Я хотел заменить пример pthread_spinlock_t своей собственной реализацией спин-блокировки. Однако результат моей реализации буквально намного ниже, чем производительность pthread_spinlock_t. Хотя результат pthread_spinlock_t составляет около 0,9 с, моя собственная реализация занимает около 2,4 с. Может ли кто-нибудь объяснить, чего не хватает в моей реализации или какие еще возможности для улучшения? Я считаю, что мне не хватает чего-то, связанного с упорядочиванием памяти. Вот моя реализация ниже
#include #include #include #include #include #include #include #include #define ПЕТЛИ 10000000 использование пространства имен std; список the_list; //pthread_spinlock_t спинблокировка; std::atomic_flag флаг = ATOMIC_FLAG_INIT; pid_t gettid() { return syscall( __NR_gettid ); } void *consumer(void *ptr) { printf("Потребительский TID %lu\n", (unsigned long)gettid()); пока (1) { //pthread_spin_lock(&spinlock); while (flag.test_and_set(std::memory_order_acquire)); если (the_list.empty()) { //pthread_spin_unlock(&spinlock); flag.clear(std::memory_order_release); перерыв; } the_list.front(); the_list.pop_front(); //pthread_spin_unlock(&spinlock); flag.clear(std::memory_order_release); } вернуть НУЛЬ; } интервал основной() { интервал я; pthread_t thr1, thr2; структура timeval tv1, tv2; //pthread_spin_init(&spinlock, 0); // Создание содержимого списка... для (я = 0; я tv2.tv_usec) { tv2.tv_sec--; tv2.tv_usec += 1000000; } printf("Результат - %ld.%ld\n", tv2.tv_sec - tv1.tv_sec, tv2.tv_usec - tv1.tv_usec); //pthread_spin_destroy(&spinlock); вернуть 0; } Я ожидал добиться производительности pthread_spin с помощью своей собственной реализации
Мобильная версия