static bool debug = false;
static char* str;
static volatile int ind = 0;
void* threadfunc(void* data) {
Β pthread_barrier_wait(&bstart);
Β unsigned long i = 0;
Β char tid[8];
Β sprintf(tid, "%d", pthread_self());
Β uint64_t t = 0, t1;
Β while (i++ != N) {
Β t1 = ClockCycles();
Β pthread_mutex_lock(&mutex);
Β if (debug) str[ind++] = *tid;
Β pthread_mutex_unlock(&mutex);
Β t += ClockCycles() - t1;
Β sched_yield();
Β }
Β cout << pthread_self() << "\t: cycles - "
Β << t << ", on mutex - " << t / N << endl;
Β return NULL;
}
int main(int argc, char *argv[]) {
Β int opt, val;
Β while ((opt = getopt(argc, argv, "n,v")) != -1) {
Β Β switch (opt) {
Β Β case 'n':
Β Β if (sscanf(optarg, "%i", &val) != 1)
Β Β Β cout << "parse command line error" << endl, exit(EXIT_FAILURE);
Β Β if (val > 0) N = val;
Β Β break;
Β case 'v':
Β Β debug = true;
Β Β break;
Β default:
Β Β exit(EXIT_FAILURE);
Β }
Β }
Β if (debug) str = new char[2 * N + 1];
Β const int T = 2;
Β pthread_t tid[T];
Β if (pthread_barrier_init(&bstart, NULL, T) != EOK)
Β perror("barrier init"), exit(EXIT_FAILURE);
Β for (int i = 0; i < T; i++)
Β if (pthread_create(tid + i, NULL, threadfunc, NULL) != EOK)
Β Β perror("thread create"), exit(EXIT_FAILURE);
Β for (int i = 0; i < T; i++)
Β pthread_join(tid[i], NULL);
Β if (debug) {
Β str[ind] = '\0';
Β cout << str << endl;
Β delete [] str;
Β }
Β exit(EXIT_SUCCESS);
}Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ°:
# sy20m -n100000
3Β Β Β Β Β Β : cycles - 14644442, on mutex - 146
2Β Β Β Β Β Β Β : cycles - 14614219; on mutex - 146
# sy20m -n1000000
3Β Β Β Β Β Β : cycles - 146505047; on mutex - 146
2Β Β Β Β Β Β : cycles - 146388673; on mutex - 146ΠΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΌΡΡΡΠ΅ΠΊΡΠ° Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°Π³ΡΠΎΠΌΠΎΠΆΠ΄Π°ΡΡ ΡΠ΅ΠΊΡΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ( ΡΠ°ΠΉΠ» sy20s.cc):
1.Β ΠΠΌΠ΅ΡΡΠΎ ΠΌΡΡΡΠ΅ΠΊΡΠ° ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ, Π° ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠ° Π·Π°ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ (Π² ΡΠ΅Π»Π΅ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ) Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Ρ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ΠΌ Π΅ΠΌΡ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ 1:
static sem_t sem;
...
if (sem_init(&sem, 0, 1) != 0)
Β perror("semaphore init"), exit(EXIT_FAILURE);2.Β Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π²ΠΈΠ΄:
void* threadfunc(void* data) {
Β ...
Β while (i++ != N) {
Β t1 = ClockCycles();
Β sem_wait(&sem);
Β if (debug) str[ind++] = *tid;
Β sem_post(&sem);
Β t += ClockCycles() - t1;
Β sched_yield();
Β }
Β ...
}Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π° ΡΡΠΎΡ ΡΠ°Π· ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ:
# sy20s -n100000
3Β Β Β Β Β Β : cycles - 87048886; on semaphore - 870
2Β Β Β Β Β Β : cycles - 87077787; on semaphore - 870
# sy20s -n1000000
3Β Β Β Β Β Β : cycles - 869638168; on semaphore β 869
2Β Β Β Β Β Β : cycles - 868725494, on semaphore - 868ΠΠ΅Π»Π°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π² ΡΡΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅ ΡΠ΅ΡΡΠΎΠ², ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ( ΡΠ°ΠΉΠ» sy20n.cc):
1. ΠΠΌΠ΅ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ:
static sem_t* sem;
...
const char semname[] = "/duble";
if ((sem = sem_open(semname, O_CREAT, S_IRWX0, 1)) == SEM_FAILED)
Β perror("semaphore init"), exit(EXIT_FAILURE);ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π·Π°ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ. Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠ°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ
sem_open()sem_t
if (sem_open( ... ) == -1)ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΡΡ ΠΎΡΠΈΠ±ΠΊΡ (Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΠΈΠΏΠΎΠ²) ΠΈ Π½Π΅ ΠΏΡΠΎΠΉΠ΄Π΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ! ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½Π΅Π΅ Π±ΡΠ»ΠΎ Π±Ρ Π΄Π»Ρ ΡΠ°ΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ
NULL
#define SEM_FAILED ((sem_t*)(-1))Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ QNX ΠΎΠ½Π° Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΡΡΡ, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΠΎΠ½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°, ΠΈ Π²ΡΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ!