├── Makefile ├── c_flamegraph.svg ├── c_mutex_flamegraph.svg ├── counter_race.c ├── counter_with_atomics.c ├── counter_with_mutex.c ├── counter_with_spinlock.c ├── rust_atomics_flamegraph.svg ├── rust_counter_atomics.rs ├── rust_counter_mutex.rs └── rust_mutex_flamegraph.svg /Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | gcc -std=c99 -o counter_race counter_race.c -lpthread 3 | gcc -std=c99 -o counter_with_mutex counter_with_mutex.c -lpthread 4 | gcc -std=c99 -o counter_with_spinlock counter_with_spinlock.c -lpthread -D_POSIX_C_SOURCE=200112L 5 | gcc -std=c99 -o counter_with_atomics counter_with_atomics.c -lpthread -D_POSIX_C_SOURCE=200112L 6 | rustc -O rust_counter_mutex.rs 7 | rustc -O rust_counter_atomics.rs 8 | -------------------------------------------------------------------------------- /c_mutex_flamegraph.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 21 | 22 | Flame Graph 23 | 24 | 25 | enqueue_entity (8,075 samples, 2.05%) 26 | e.. 27 | 28 | 29 | plist_add (299 samples, 0.08%) 30 | 31 | 32 | pick_next_task_fair (3,914 samples, 1.00%) 33 | 34 | 35 | futex_wait_setup (62,765 samples, 15.96%) 36 | futex_wait_setup 37 | 38 | 39 | [unknown] (34 samples, 0.01%) 40 | 41 | 42 | __lll_unlock_wake (208,118 samples, 52.93%) 43 | __lll_unlock_wake 44 | 45 | 46 | place_entity (463 samples, 0.12%) 47 | 48 | 49 | __ticket_spin_unlock (340 samples, 0.09%) 50 | 51 | 52 | ret_from_intr (38 samples, 0.01%) 53 | 54 | 55 | [unknown] (34 samples, 0.01%) 56 | 57 | 58 | update_curr (1,417 samples, 0.36%) 59 | 60 | 61 | rb_next (375 samples, 0.10%) 62 | 63 | 64 | perf_event_context_sched_out (1,632 samples, 0.42%) 65 | 66 | 67 | [unknown] (34 samples, 0.01%) 68 | 69 | 70 | ret_from_sys_call (124 samples, 0.03%) 71 | 72 | 73 | native_load_tls (135 samples, 0.03%) 74 | 75 | 76 | __ticket_spin_lock (499 samples, 0.13%) 77 | 78 | 79 | do_futex (99,517 samples, 25.31%) 80 | do_futex 81 | 82 | 83 | rb_erase (1,057 samples, 0.27%) 84 | 85 | 86 | place_entity (45 samples, 0.01%) 87 | 88 | 89 | sys_futex (437 samples, 0.11%) 90 | 91 | 92 | [unknown] (34 samples, 0.01%) 93 | 94 | 95 | native_read_tsc (172 samples, 0.04%) 96 | 97 | 98 | wakeup_preempt_entity.isra.37 (92 samples, 0.02%) 99 | 100 | 101 | [unknown] (34 samples, 0.01%) 102 | 103 | 104 | [unknown] (34 samples, 0.01%) 105 | 106 | 107 | [unknown] (34 samples, 0.01%) 108 | 109 | 110 | [unknown] (34 samples, 0.01%) 111 | 112 | 113 | [unknown] (34 samples, 0.01%) 114 | 115 | 116 | _raw_spin_lock (44,467 samples, 11.31%) 117 | _raw_spin_lock 118 | 119 | 120 | pthread_mutex_lock@plt (396 samples, 0.10%) 121 | 122 | 123 | _raw_spin_unlock_irqrestore (272 samples, 0.07%) 124 | 125 | 126 | __ticket_spin_lock (253 samples, 0.06%) 127 | 128 | 129 | [unknown] (34 samples, 0.01%) 130 | 131 | 132 | [unknown] (34 samples, 0.01%) 133 | 134 | 135 | intel_pmu_enable_all (189 samples, 0.05%) 136 | 137 | 138 | [unknown] (34 samples, 0.01%) 139 | 140 | 141 | perf_event_context_sched_in (34 samples, 0.01%) 142 | 143 | 144 | [unknown] (34 samples, 0.01%) 145 | 146 | 147 | pick_next_entity (76 samples, 0.02%) 148 | 149 | 150 | smp_apic_timer_interrupt (51 samples, 0.01%) 151 | 152 | 153 | [unknown] (34 samples, 0.01%) 154 | 155 | 156 | rb_erase (72 samples, 0.02%) 157 | 158 | 159 | [unknown] (34 samples, 0.01%) 160 | 161 | 162 | [unknown] (34 samples, 0.01%) 163 | 164 | 165 | ret_from_intr (37 samples, 0.01%) 166 | 167 | 168 | [unknown] (34 samples, 0.01%) 169 | 170 | 171 | hrtimer_interrupt (101 samples, 0.03%) 172 | 173 | 174 | [unknown] (34 samples, 0.01%) 175 | 176 | 177 | [unknown] (34 samples, 0.01%) 178 | 179 | 180 | [unknown] (34 samples, 0.01%) 181 | 182 | 183 | update_rq_clock (952 samples, 0.24%) 184 | 185 | 186 | clear_buddies (63 samples, 0.02%) 187 | 188 | 189 | [unknown] (34 samples, 0.01%) 190 | 191 | 192 | [unknown] (34 samples, 0.01%) 193 | 194 | 195 | get_futex_key (3,411 samples, 0.87%) 196 | 197 | 198 | find_next_bit (187 samples, 0.05%) 199 | 200 | 201 | native_sched_clock (35 samples, 0.01%) 202 | 203 | 204 | [unknown] (34 samples, 0.01%) 205 | 206 | 207 | calc_delta_mine (251 samples, 0.06%) 208 | 209 | 210 | __ticket_spin_lock (1,012 samples, 0.26%) 211 | 212 | 213 | ret_from_sys_call (131 samples, 0.03%) 214 | 215 | 216 | [unknown] (34 samples, 0.01%) 217 | 218 | 219 | futex_wake (181,174 samples, 46.08%) 220 | futex_wake 221 | 222 | 223 | get_futex_value_locked (177 samples, 0.05%) 224 | 225 | 226 | [unknown] (34 samples, 0.01%) 227 | 228 | 229 | check_preempt_wakeup (136 samples, 0.03%) 230 | 231 | 232 | [unknown] (34 samples, 0.01%) 233 | 234 | 235 | [unknown] (34 samples, 0.01%) 236 | 237 | 238 | futex_wait_setup (527 samples, 0.13%) 239 | 240 | 241 | __rb_erase_color (90 samples, 0.02%) 242 | 243 | 244 | start_thread (392,957 samples, 99.95%) 245 | start_thread 246 | 247 | 248 | get_futex_key (282 samples, 0.07%) 249 | 250 | 251 | schedule (23,057 samples, 5.86%) 252 | schedule 253 | 254 | 255 | enqueue_task_fair (8,850 samples, 2.25%) 256 | e.. 257 | 258 | 259 | ttwu_stat (36 samples, 0.01%) 260 | 261 | 262 | [unknown] (34 samples, 0.01%) 263 | 264 | 265 | [unknown] (34 samples, 0.01%) 266 | 267 | 268 | [unknown] (34 samples, 0.01%) 269 | 270 | 271 | handle_irq_event_percpu (87 samples, 0.02%) 272 | 273 | 274 | reweight_entity (1,900 samples, 0.48%) 275 | 276 | 277 | _raw_spin_lock (17,836 samples, 4.54%) 278 | _raw_.. 279 | 280 | 281 | sys_futex (295 samples, 0.08%) 282 | 283 | 284 | update_curr (142 samples, 0.04%) 285 | 286 | 287 | futex_wait (97,750 samples, 24.86%) 288 | futex_wait 289 | 290 | 291 | _raw_spin_lock (560 samples, 0.14%) 292 | 293 | 294 | do_IRQ (115 samples, 0.03%) 295 | 296 | 297 | update_rq_clock (806 samples, 0.21%) 298 | 299 | 300 | __lll_lock_wait (128,425 samples, 32.66%) 301 | __lll_lock_wait 302 | 303 | 304 | __switch_to (786 samples, 0.20%) 305 | 306 | 307 | [unknown] (34 samples, 0.01%) 308 | 309 | 310 | [unknown] (34 samples, 0.01%) 311 | 312 | 313 | __ticket_spin_unlock (167 samples, 0.04%) 314 | 315 | 316 | [unknown] (34 samples, 0.01%) 317 | 318 | 319 | native_sched_clock (49 samples, 0.01%) 320 | 321 | 322 | task_waking_fair (195 samples, 0.05%) 323 | 324 | 325 | __ticket_spin_lock (625 samples, 0.16%) 326 | 327 | 328 | [unknown] (34 samples, 0.01%) 329 | 330 | 331 | select_idle_sibling (2,159 samples, 0.55%) 332 | 333 | 334 | finish_task_switch (813 samples, 0.21%) 335 | 336 | 337 | system_call_after_swapgs (3,328 samples, 0.85%) 338 | 339 | 340 | drop_futex_key_refs.isra.13 (229 samples, 0.06%) 341 | 342 | 343 | ttwu_queue (12,030 samples, 3.06%) 344 | ttw.. 345 | 346 | 347 | [unknown] (34 samples, 0.01%) 348 | 349 | 350 | [unknown] (34 samples, 0.01%) 351 | 352 | 353 | __ticket_spin_unlock (1,978 samples, 0.50%) 354 | 355 | 356 | all (393,159 samples, 100%) 357 | 358 | 359 | 360 | [unknown] (34 samples, 0.01%) 361 | 362 | 363 | perf_event_sync_stat (45 samples, 0.01%) 364 | 365 | 366 | walk_tg_tree_from (34 samples, 0.01%) 367 | 368 | 369 | native_read_tsc (194 samples, 0.05%) 370 | 371 | 372 | [unknown] (34 samples, 0.01%) 373 | 374 | 375 | update_cfs_shares (437 samples, 0.11%) 376 | 377 | 378 | default_spin_lock_flags (62 samples, 0.02%) 379 | 380 | 381 | [unknown] (34 samples, 0.01%) 382 | 383 | 384 | __lll_lock_wait (49 samples, 0.01%) 385 | 386 | 387 | select_task_rq_fair (7,963 samples, 2.03%) 388 | s.. 389 | 390 | 391 | wake_futex (44,624 samples, 11.35%) 392 | wake_futex 393 | 394 | 395 | source_load (500 samples, 0.13%) 396 | 397 | 398 | rcu_note_context_switch (353 samples, 0.09%) 399 | 400 | 401 | idle_balance (59 samples, 0.02%) 402 | 403 | 404 | schedule (55 samples, 0.01%) 405 | 406 | 407 | get_futex_key (2,727 samples, 0.69%) 408 | 409 | 410 | [unknown] (34 samples, 0.01%) 411 | 412 | 413 | update_cfs_load (205 samples, 0.05%) 414 | 415 | 416 | [unknown] (34 samples, 0.01%) 417 | 418 | 419 | __ticket_spin_lock (17,813 samples, 4.53%) 420 | __tic.. 421 | 422 | 423 | perf_event_context_sched_in (378 samples, 0.10%) 424 | 425 | 426 | ret_from_intr (115 samples, 0.03%) 427 | 428 | 429 | [unknown] (34 samples, 0.01%) 430 | 431 | 432 | load_balance (51 samples, 0.01%) 433 | 434 | 435 | [unknown] (36 samples, 0.01%) 436 | 437 | 438 | [unknown] (34 samples, 0.01%) 439 | 440 | 441 | [unknown] (34 samples, 0.01%) 442 | 443 | 444 | system_call (4,383 samples, 1.11%) 445 | 446 | 447 | [unknown] (34 samples, 0.01%) 448 | 449 | 450 | plist_del (42 samples, 0.01%) 451 | 452 | 453 | pthread_mutex_lock (31,501 samples, 8.01%) 454 | pthread_mut.. 455 | 456 | 457 | enqueue_task (9,905 samples, 2.52%) 458 | en.. 459 | 460 | 461 | sysret_check (1,066 samples, 0.27%) 462 | 463 | 464 | [unknown] (34 samples, 0.01%) 465 | 466 | 467 | native_sched_clock (193 samples, 0.05%) 468 | 469 | 470 | _raw_spin_lock_irq (662 samples, 0.17%) 471 | 472 | 473 | set_next_buddy (45 samples, 0.01%) 474 | 475 | 476 | sys_futex (192,360 samples, 48.93%) 477 | sys_futex 478 | 479 | 480 | ttwu_do_activate.constprop.86 (11,538 samples, 2.93%) 481 | tt.. 482 | 483 | 484 | enqueue_sleeper (559 samples, 0.14%) 485 | 486 | 487 | sched_clock_cpu (481 samples, 0.12%) 488 | 489 | 490 | set_next_buddy (66 samples, 0.02%) 491 | 492 | 493 | [unknown] (34 samples, 0.01%) 494 | 495 | 496 | [unknown] (34 samples, 0.01%) 497 | 498 | 499 | update_process_times (48 samples, 0.01%) 500 | 501 | 502 | update_stats_wait_end (682 samples, 0.17%) 503 | 504 | 505 | sched_clock (373 samples, 0.09%) 506 | 507 | 508 | get_futex_value_locked (1,036 samples, 0.26%) 509 | 510 | 511 | apic_timer_interrupt (53 samples, 0.01%) 512 | 513 | 514 | update_cfs_shares (2,842 samples, 0.72%) 515 | 516 | 517 | _raw_spin_lock (235 samples, 0.06%) 518 | 519 | 520 | apic_timer_interrupt (53 samples, 0.01%) 521 | 522 | 523 | calc_delta_mine (243 samples, 0.06%) 524 | 525 | 526 | [unknown] (34 samples, 0.01%) 527 | 528 | 529 | do_IRQ (37 samples, 0.01%) 530 | 531 | 532 | native_write_msr_safe (1,378 samples, 0.35%) 533 | 534 | 535 | [unknown] (34 samples, 0.01%) 536 | 537 | 538 | _L_unlock_644 (1,045 samples, 0.27%) 539 | 540 | 541 | apic_timer_interrupt (64 samples, 0.02%) 542 | 543 | 544 | [unknown] (34 samples, 0.01%) 545 | 546 | 547 | [unknown] (34 samples, 0.01%) 548 | 549 | 550 | deactivate_task (9,171 samples, 2.33%) 551 | d.. 552 | 553 | 554 | [unknown] (34 samples, 0.01%) 555 | 556 | 557 | idle_cpu (866 samples, 0.22%) 558 | 559 | 560 | reweight_entity (1,866 samples, 0.47%) 561 | 562 | 563 | __rb_rotate_left (44 samples, 0.01%) 564 | 565 | 566 | __ticket_spin_lock (785 samples, 0.20%) 567 | 568 | 569 | perf_event_task_sched_out (1,890 samples, 0.48%) 570 | 571 | 572 | [unknown] (34 samples, 0.01%) 573 | 574 | 575 | sched_clock_cpu (569 samples, 0.14%) 576 | 577 | 578 | [unknown] (34 samples, 0.01%) 579 | 580 | 581 | __schedule (485 samples, 0.12%) 582 | 583 | 584 | get_futex_key_refs.isra.10 (165 samples, 0.04%) 585 | 586 | 587 | default_spin_lock_flags (793 samples, 0.20%) 588 | 589 | 590 | sched_clock (38 samples, 0.01%) 591 | 592 | 593 | __ticket_spin_is_locked (137 samples, 0.03%) 594 | 595 | 596 | __unqueue_futex (141 samples, 0.04%) 597 | 598 | 599 | update_curr (1,233 samples, 0.31%) 600 | 601 | 602 | futex_wait_queue_me (36 samples, 0.01%) 603 | 604 | 605 | drop_futex_key_refs.isra.13 (111 samples, 0.03%) 606 | 607 | 608 | [unknown] (34 samples, 0.01%) 609 | 610 | 611 | hash_futex (3,559 samples, 0.91%) 612 | 613 | 614 | [unknown] (34 samples, 0.01%) 615 | 616 | 617 | [unknown] (34 samples, 0.01%) 618 | 619 | 620 | clear_buddies (170 samples, 0.04%) 621 | 622 | 623 | [unknown] (34 samples, 0.01%) 624 | 625 | 626 | system_call_after_swapgs (2,453 samples, 0.62%) 627 | 628 | 629 | i8042_interrupt (56 samples, 0.01%) 630 | 631 | 632 | drop_futex_key_refs.isra.13 (173 samples, 0.04%) 633 | 634 | 635 | check_preempt_curr (979 samples, 0.25%) 636 | 637 | 638 | hash_futex (270 samples, 0.07%) 639 | 640 | 641 | [unknown] (34 samples, 0.01%) 642 | 643 | 644 | hrtimer_interrupt (40 samples, 0.01%) 645 | 646 | 647 | cpuacct_charge (1,067 samples, 0.27%) 648 | 649 | 650 | __ticket_spin_lock (120,667 samples, 30.69%) 651 | __ticket_spin_lock 652 | 653 | 654 | do_futex (188,664 samples, 47.99%) 655 | do_futex 656 | 657 | 658 | native_read_tsc (112 samples, 0.03%) 659 | 660 | 661 | __rb_erase_color (748 samples, 0.19%) 662 | 663 | 664 | [unknown] (34 samples, 0.01%) 665 | 666 | 667 | [unknown] (34 samples, 0.01%) 668 | 669 | 670 | put_prev_task_fair (999 samples, 0.25%) 671 | 672 | 673 | _raw_spin_lock (121,253 samples, 30.84%) 674 | _raw_spin_lock 675 | 676 | 677 | [unknown] (34 samples, 0.01%) 678 | 679 | 680 | native_sched_clock (339 samples, 0.09%) 681 | 682 | 683 | [unknown] (34 samples, 0.01%) 684 | 685 | 686 | update_cfs_shares (600 samples, 0.15%) 687 | 688 | 689 | update_stats_wait_end (48 samples, 0.01%) 690 | 691 | 692 | [unknown] (34 samples, 0.01%) 693 | 694 | 695 | __ticket_spin_unlock (36 samples, 0.01%) 696 | 697 | 698 | get_futex_key_refs.isra.10 (216 samples, 0.05%) 699 | 700 | 701 | futex_wait (380 samples, 0.10%) 702 | 703 | 704 | update_curr (85 samples, 0.02%) 705 | 706 | 707 | [unknown] (34 samples, 0.01%) 708 | 709 | 710 | AddThings (3,078 samples, 0.78%) 711 | 712 | 713 | apic_timer_interrupt (148 samples, 0.04%) 714 | 715 | 716 | activate_task (9,964 samples, 2.53%) 717 | ac.. 718 | 719 | 720 | update_cfs_load (48 samples, 0.01%) 721 | 722 | 723 | __ticket_spin_lock (44,120 samples, 11.22%) 724 | __ticket_spin_lock 725 | 726 | 727 | check_preempt_wakeup (742 samples, 0.19%) 728 | 729 | 730 | [unknown] (34 samples, 0.01%) 731 | 732 | 733 | [unknown] (34 samples, 0.01%) 734 | 735 | 736 | find_next_bit (360 samples, 0.09%) 737 | 738 | 739 | x86_pmu_enable (189 samples, 0.05%) 740 | 741 | 742 | [unknown] (34 samples, 0.01%) 743 | 744 | 745 | [unknown] (34 samples, 0.01%) 746 | 747 | 748 | ret_from_intr (35 samples, 0.01%) 749 | 750 | 751 | unqueue_me (312 samples, 0.08%) 752 | 753 | 754 | [unknown] (34 samples, 0.01%) 755 | 756 | 757 | futex_wait_queue_me (24,509 samples, 6.23%) 758 | futex_wa.. 759 | 760 | 761 | [unknown] (34 samples, 0.01%) 762 | 763 | 764 | system_call (3,377 samples, 0.86%) 765 | 766 | 767 | perf_event_context_sched_out (57 samples, 0.01%) 768 | 769 | 770 | [unknown] (34 samples, 0.01%) 771 | 772 | 773 | __switch_to (56 samples, 0.01%) 774 | 775 | 776 | hash_futex (4,423 samples, 1.12%) 777 | 778 | 779 | system_call_fastpath (102,187 samples, 25.99%) 780 | system_call_fastpath 781 | 782 | 783 | dequeue_task (9,093 samples, 2.31%) 784 | d.. 785 | 786 | 787 | rcu_note_context_switch (743 samples, 0.19%) 788 | 789 | 790 | [unknown] (34 samples, 0.01%) 791 | 792 | 793 | sysret_check (739 samples, 0.19%) 794 | 795 | 796 | [unknown] (34 samples, 0.01%) 797 | 798 | 799 | [unknown] (34 samples, 0.01%) 800 | 801 | 802 | __perf_event_task_sched_out (1,787 samples, 0.45%) 803 | 804 | 805 | wakeup_preempt_entity.isra.37 (55 samples, 0.01%) 806 | 807 | 808 | [unknown] (34 samples, 0.01%) 809 | 810 | 811 | do_IRQ (38 samples, 0.01%) 812 | 813 | 814 | __bitmap_intersects (96 samples, 0.02%) 815 | 816 | 817 | native_write_msr_safe (189 samples, 0.05%) 818 | 819 | 820 | [unknown] (34 samples, 0.01%) 821 | 822 | 823 | update_cfs_shares (2,632 samples, 0.67%) 824 | 825 | 826 | __ticket_spin_unlock (190 samples, 0.05%) 827 | 828 | 829 | [unknown] (34 samples, 0.01%) 830 | 831 | 832 | __run_hrtimer (92 samples, 0.02%) 833 | 834 | 835 | sys_futex (101,435 samples, 25.80%) 836 | sys_futex 837 | 838 | 839 | __schedule (55 samples, 0.01%) 840 | 841 | 842 | [unknown] (34 samples, 0.01%) 843 | 844 | 845 | futex_wake (582 samples, 0.15%) 846 | 847 | 848 | ttwu_do_wakeup (1,425 samples, 0.36%) 849 | 850 | 851 | smp_apic_timer_interrupt (35 samples, 0.01%) 852 | 853 | 854 | do_futex (814 samples, 0.21%) 855 | 856 | 857 | dequeue_task_fair (7,739 samples, 1.97%) 858 | d.. 859 | 860 | 861 | __ticket_spin_unlock (46 samples, 0.01%) 862 | 863 | 864 | [unknown] (34 samples, 0.01%) 865 | 866 | 867 | [unknown] (34 samples, 0.01%) 868 | 869 | 870 | sched_clock (417 samples, 0.11%) 871 | 872 | 873 | sysret_careful (55 samples, 0.01%) 874 | 875 | 876 | drop_futex_key_refs.isra.13 (330 samples, 0.08%) 877 | 878 | 879 | smp_apic_timer_interrupt (60 samples, 0.02%) 880 | 881 | 882 | do_futex (509 samples, 0.13%) 883 | 884 | 885 | set_next_entity (2,760 samples, 0.70%) 886 | 887 | 888 | wake_up_state (43,274 samples, 11.01%) 889 | wake_up_state 890 | 891 | 892 | rb_next (163 samples, 0.04%) 893 | 894 | 895 | rb_insert_color (127 samples, 0.03%) 896 | 897 | 898 | _raw_spin_lock (272 samples, 0.07%) 899 | 900 | 901 | idle_cpu (95 samples, 0.02%) 902 | 903 | 904 | smp_apic_timer_interrupt (142 samples, 0.04%) 905 | 906 | 907 | system_call_fastpath (193,511 samples, 49.22%) 908 | system_call_fastpath 909 | 910 | 911 | [unknown] (34 samples, 0.01%) 912 | 913 | 914 | try_to_wake_up (42,909 samples, 10.91%) 915 | try_to_wake_up 916 | 917 | 918 | [unknown] (34 samples, 0.01%) 919 | 920 | 921 | do_IRQ (34 samples, 0.01%) 922 | 923 | 924 | handle_irq (94 samples, 0.02%) 925 | 926 | 927 | dequeue_entity (6,318 samples, 1.61%) 928 | 929 | 930 | [unknown] (34 samples, 0.01%) 931 | 932 | 933 | finish_task_switch (35 samples, 0.01%) 934 | 935 | 936 | __run_hrtimer (38 samples, 0.01%) 937 | 938 | 939 | put_prev_entity (858 samples, 0.22%) 940 | 941 | 942 | [unknown] (34 samples, 0.01%) 943 | 944 | 945 | update_curr (35 samples, 0.01%) 946 | 947 | 948 | [unknown] (34 samples, 0.01%) 949 | 950 | 951 | get_futex_key_refs.isra.10 (266 samples, 0.07%) 952 | 953 | 954 | [unknown] (34 samples, 0.01%) 955 | 956 | 957 | __ticket_spin_lock (1,620 samples, 0.41%) 958 | 959 | 960 | update_cfs_load (141 samples, 0.04%) 961 | 962 | 963 | [unknown] (34 samples, 0.01%) 964 | 965 | 966 | [unknown] (34 samples, 0.01%) 967 | 968 | 969 | [unknown] (34 samples, 0.01%) 970 | 971 | 972 | [unknown] (34 samples, 0.01%) 973 | 974 | 975 | handle_edge_irq (89 samples, 0.02%) 976 | 977 | 978 | hrtimer_interrupt (43 samples, 0.01%) 979 | 980 | 981 | [unknown] (34 samples, 0.01%) 982 | 983 | 984 | [unknown] (34 samples, 0.01%) 985 | 986 | 987 | __run_hrtimer (34 samples, 0.01%) 988 | 989 | 990 | apic_timer_interrupt (36 samples, 0.01%) 991 | 992 | 993 | __bitmap_intersects (171 samples, 0.04%) 994 | 995 | 996 | __ticket_spin_lock (106 samples, 0.03%) 997 | 998 | 999 | pick_next_entity (640 samples, 0.16%) 1000 | 1001 | 1002 | rb_insert_color (197 samples, 0.05%) 1003 | 1004 | 1005 | [unknown] (34 samples, 0.01%) 1006 | 1007 | 1008 | [unknown] (34 samples, 0.01%) 1009 | 1010 | 1011 | tick_sched_timer (61 samples, 0.02%) 1012 | 1013 | 1014 | _raw_spin_lock (372 samples, 0.09%) 1015 | 1016 | 1017 | [unknown] (34 samples, 0.01%) 1018 | 1019 | 1020 | [unknown] (34 samples, 0.01%) 1021 | 1022 | 1023 | __enqueue_entity (223 samples, 0.06%) 1024 | 1025 | 1026 | put_prev_task_fair (35 samples, 0.01%) 1027 | 1028 | 1029 | pthread_mutex_unlock@plt (255 samples, 0.06%) 1030 | 1031 | 1032 | [unknown] (34 samples, 0.01%) 1033 | 1034 | 1035 | [unknown] (34 samples, 0.01%) 1036 | 1037 | 1038 | update_curr (2,434 samples, 0.62%) 1039 | 1040 | 1041 | [unknown] (34 samples, 0.01%) 1042 | 1043 | 1044 | target_load (149 samples, 0.04%) 1045 | 1046 | 1047 | [unknown] (34 samples, 0.01%) 1048 | 1049 | 1050 | __ticket_spin_unlock (602 samples, 0.15%) 1051 | 1052 | 1053 | cpuacct_charge (548 samples, 0.14%) 1054 | 1055 | 1056 | [unknown] (34 samples, 0.01%) 1057 | 1058 | 1059 | [unknown] (34 samples, 0.01%) 1060 | 1061 | 1062 | __perf_event_task_sched_in (497 samples, 0.13%) 1063 | 1064 | 1065 | __enqueue_entity (1,405 samples, 0.36%) 1066 | 1067 | 1068 | get_futex_key (264 samples, 0.07%) 1069 | 1070 | 1071 | put_prev_entity (37 samples, 0.01%) 1072 | 1073 | 1074 | [unknown] (34 samples, 0.01%) 1075 | 1076 | 1077 | wake_affine (3,704 samples, 0.94%) 1078 | 1079 | 1080 | native_read_tsc (74 samples, 0.02%) 1081 | 1082 | 1083 | smp_apic_timer_interrupt (49 samples, 0.01%) 1084 | 1085 | 1086 | effective_load.isra.29 (2,006 samples, 0.51%) 1087 | 1088 | 1089 | update_curr (2,477 samples, 0.63%) 1090 | 1091 | 1092 | copy_user_generic_string (8,024 samples, 2.04%) 1093 | c.. 1094 | 1095 | 1096 | _L_lock_858 (997 samples, 0.25%) 1097 | 1098 | 1099 | _raw_spin_lock_irqsave (1,057 samples, 0.27%) 1100 | 1101 | 1102 | __lll_unlock_wake (69 samples, 0.02%) 1103 | 1104 | 1105 | [unknown] (34 samples, 0.01%) 1106 | 1107 | 1108 | get_futex_key_refs.isra.10 (363 samples, 0.09%) 1109 | 1110 | 1111 | set_next_entity (109 samples, 0.03%) 1112 | 1113 | 1114 | pthread_mutex_unlock (19,139 samples, 4.87%) 1115 | pthrea.. 1116 | 1117 | 1118 | [unknown] (34 samples, 0.01%) 1119 | 1120 | 1121 | [unknown] (34 samples, 0.01%) 1122 | 1123 | 1124 | plist_add (40 samples, 0.01%) 1125 | 1126 | 1127 | [unknown] (34 samples, 0.01%) 1128 | 1129 | 1130 | hash_futex (321 samples, 0.08%) 1131 | 1132 | 1133 | [unknown] (34 samples, 0.01%) 1134 | 1135 | 1136 | ttwu_stat (437 samples, 0.11%) 1137 | 1138 | 1139 | __schedule (22,430 samples, 5.71%) 1140 | __sched.. 1141 | 1142 | 1143 | [unknown] (34 samples, 0.01%) 1144 | 1145 | 1146 | handle_irq_event (89 samples, 0.02%) 1147 | 1148 | 1149 | -------------------------------------------------------------------------------- /counter_race.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #define NUM_THREADS 20 5 | #define NUM_INCREMENTS 1000000 6 | 7 | int counter; 8 | 9 | void *AddThings(void *threadid) 10 | { 11 | for (int i = 0; i < NUM_INCREMENTS; i++) 12 | counter += 1; 13 | pthread_exit(NULL); 14 | } 15 | 16 | int main (int argc, char *argv[]) 17 | { 18 | pthread_t threads[NUM_THREADS]; 19 | long t; 20 | for(t = 0; t 2 | #include 3 | #include 4 | #define NUM_THREADS 20 5 | #define NUM_INCREMENTS 1000000 6 | 7 | int counter; 8 | 9 | void *AddThings(void *threadid) 10 | { 11 | for (int i = 0; i < NUM_INCREMENTS; i++) { 12 | __sync_add_and_fetch(&counter, 1); 13 | } 14 | pthread_exit(NULL); 15 | } 16 | 17 | int main (int argc, char *argv[]) 18 | { 19 | pthread_t threads[NUM_THREADS]; 20 | long t; 21 | for(t=0; t 2 | #include 3 | #include 4 | #define NUM_THREADS 20 5 | #define NUM_INCREMENTS 1000000 6 | 7 | int counter; 8 | pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 9 | 10 | void *AddThings(void *threadid) 11 | { 12 | for (int i = 0; i < NUM_INCREMENTS; i++) { 13 | pthread_mutex_lock(&mutex); 14 | counter += 1; 15 | pthread_mutex_unlock(&mutex); 16 | } 17 | pthread_exit(NULL); 18 | } 19 | 20 | int main (int argc, char *argv[]) 21 | { 22 | pthread_t threads[NUM_THREADS]; 23 | long t; 24 | for(t=0; t 2 | #include 3 | #include 4 | #define NUM_THREADS 20 5 | #define NUM_INCREMENTS 1000000 6 | 7 | int counter; 8 | pthread_spinlock_t spinlock; 9 | 10 | 11 | void *AddThings(void *threadid) 12 | { 13 | for (int i = 0; i < NUM_INCREMENTS; i++) { 14 | pthread_spin_lock(&spinlock); 15 | counter += 1; 16 | pthread_spin_unlock(&spinlock); 17 | } 18 | pthread_exit(NULL); 19 | } 20 | 21 | int main (int argc, char *argv[]) 22 | { 23 | pthread_spin_unlock(&spinlock); 24 | pthread_t threads[NUM_THREADS]; 25 | long t; 26 | for(t=0; t 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 21 | 22 | Flame Graph 23 | 24 | 25 | do_futex (11 samples, 0.01%) 26 | 27 | 28 | [unknown] (59 samples, 0.07%) 29 | 30 | 31 | [unknown] (59 samples, 0.07%) 32 | 33 | 34 | smp_apic_timer_interrupt (79 samples, 0.10%) 35 | 36 | 37 | rebalance_domains (7 samples, 0.01%) 38 | 39 | 40 | [unknown] (59 samples, 0.07%) 41 | 42 | 43 | [unknown] (59 samples, 0.07%) 44 | 45 | 46 | stub_execve (9 samples, 0.01%) 47 | 48 | 49 | perf_event_context_sched_in (47 samples, 0.06%) 50 | 51 | 52 | __perf_event_task_sched_in (10 samples, 0.01%) 53 | 54 | 55 | [unknown] (59 samples, 0.07%) 56 | 57 | 58 | [unknown] (59 samples, 0.07%) 59 | 60 | 61 | do_page_fault (7 samples, 0.01%) 62 | 63 | 64 | [unknown] (59 samples, 0.07%) 65 | 66 | 67 | pipe_read (7 samples, 0.01%) 68 | 69 | 70 | [unknown] (59 samples, 0.07%) 71 | 72 | 73 | iwl_rx_handle (9 samples, 0.01%) 74 | 75 | 76 | page_fault (8 samples, 0.01%) 77 | 78 | 79 | [unknown] (59 samples, 0.07%) 80 | 81 | 82 | [unknown] (59 samples, 0.07%) 83 | 84 | 85 | sys_read (7 samples, 0.01%) 86 | 87 | 88 | [unknown] (59 samples, 0.07%) 89 | 90 | 91 | [unknown] (59 samples, 0.07%) 92 | 93 | 94 | __perf_event_task_sched_in (10 samples, 0.01%) 95 | 96 | 97 | new_heap (8 samples, 0.01%) 98 | 99 | 100 | do_execve (9 samples, 0.01%) 101 | 102 | 103 | [unknown] (59 samples, 0.07%) 104 | 105 | 106 | [unknown] (59 samples, 0.07%) 107 | 108 | 109 | all (80,201 samples, 100%) 110 | 111 | 112 | 113 | x86_pmu_enable (135 samples, 0.17%) 114 | 115 | 116 | [unknown] (59 samples, 0.07%) 117 | 118 | 119 | page_fault (7 samples, 0.01%) 120 | 121 | 122 | call_rwsem_down_read_failed (7 samples, 0.01%) 123 | 124 | 125 | [unknown] (59 samples, 0.07%) 126 | 127 | 128 | native_write_msr_safe (134 samples, 0.17%) 129 | 130 | 131 | finish_task_switch (10 samples, 0.01%) 132 | 133 | 134 | [unknown] (59 samples, 0.07%) 135 | 136 | 137 | tick_sched_timer (32 samples, 0.04%) 138 | 139 | 140 | [unknown] (59 samples, 0.07%) 141 | 142 | 143 | [unknown] (59 samples, 0.07%) 144 | 145 | 146 | do_page_fault (8 samples, 0.01%) 147 | 148 | 149 | [unknown] (58 samples, 0.07%) 150 | 151 | 152 | sys_futex (11 samples, 0.01%) 153 | 154 | 155 | [unknown] (59 samples, 0.07%) 156 | 157 | 158 | [unknown] (59 samples, 0.07%) 159 | 160 | 161 | tasklet_action (9 samples, 0.01%) 162 | 163 | 164 | [unknown] (59 samples, 0.07%) 165 | 166 | 167 | [unknown] (59 samples, 0.07%) 168 | 169 | 170 | intel_pmu_enable_all (134 samples, 0.17%) 171 | 172 | 173 | [unknown] (59 samples, 0.07%) 174 | 175 | 176 | [unknown] (59 samples, 0.07%) 177 | 178 | 179 | [unknown] (59 samples, 0.07%) 180 | 181 | 182 | [unknown] (59 samples, 0.07%) 183 | 184 | 185 | [unknown] (59 samples, 0.07%) 186 | 187 | 188 | [unknown] (59 samples, 0.07%) 189 | 190 | 191 | x86_pmu_enable (10 samples, 0.01%) 192 | 193 | 194 | [unknown] (59 samples, 0.07%) 195 | 196 | 197 | [unknown] (7 samples, 0.01%) 198 | 199 | 200 | [unknown] (59 samples, 0.07%) 201 | 202 | 203 | [unknown] (59 samples, 0.07%) 204 | 205 | 206 | [unknown] (59 samples, 0.07%) 207 | 208 | 209 | [unknown] (59 samples, 0.07%) 210 | 211 | 212 | __schedule (158 samples, 0.20%) 213 | 214 | 215 | __schedule (7 samples, 0.01%) 216 | 217 | 218 | system_call_fastpath (7 samples, 0.01%) 219 | 220 | 221 | [unknown] (59 samples, 0.07%) 222 | 223 | 224 | retint_careful (159 samples, 0.20%) 225 | 226 | 227 | handle_irq_event (16 samples, 0.02%) 228 | 229 | 230 | iwl_irq_tasklet (9 samples, 0.01%) 231 | 232 | 233 | schedule (159 samples, 0.20%) 234 | 235 | 236 | __do_softirq (10 samples, 0.01%) 237 | 238 | 239 | [unknown] (59 samples, 0.07%) 240 | 241 | 242 | schedule (7 samples, 0.01%) 243 | 244 | 245 | try_to_wake_up (10 samples, 0.01%) 246 | 247 | 248 | system_call_fastpath (11 samples, 0.01%) 249 | 250 | 251 | handle_irq (20 samples, 0.02%) 252 | 253 | 254 | perf_event_context_sched_in (135 samples, 0.17%) 255 | 256 | 257 | vm_mmap_pgoff (16 samples, 0.02%) 258 | 259 | 260 | x86_pmu_enable (10 samples, 0.01%) 261 | 262 | 263 | futex_wait (11 samples, 0.01%) 264 | 265 | 266 | [unknown] (16 samples, 0.02%) 267 | 268 | 269 | [unknown] (59 samples, 0.07%) 270 | 271 | 272 | [unknown] (59 samples, 0.07%) 273 | 274 | 275 | rwsem_down_failed_common (12 samples, 0.01%) 276 | 277 | 278 | [unknown] (59 samples, 0.07%) 279 | 280 | 281 | scheduler_tick (19 samples, 0.02%) 282 | 283 | 284 | [unknown] (16 samples, 0.02%) 285 | 286 | 287 | [unknown] (59 samples, 0.07%) 288 | 289 | 290 | [unknown] (59 samples, 0.07%) 291 | 292 | 293 | sys_execve (9 samples, 0.01%) 294 | 295 | 296 | [unknown] (59 samples, 0.07%) 297 | 298 | 299 | do_softirq (20 samples, 0.02%) 300 | 301 | 302 | ret_from_fork (47 samples, 0.06%) 303 | 304 | 305 | rwsem_down_read_failed (7 samples, 0.01%) 306 | 307 | 308 | [unknown] (59 samples, 0.07%) 309 | 310 | 311 | [unknown] (59 samples, 0.07%) 312 | 313 | 314 | intel_pmu_enable_all (47 samples, 0.06%) 315 | 316 | 317 | [unknown] (59 samples, 0.07%) 318 | 319 | 320 | [unknown] (59 samples, 0.07%) 321 | 322 | 323 | __schedule (11 samples, 0.01%) 324 | 325 | 326 | [unknown] (59 samples, 0.07%) 327 | 328 | 329 | [unknown] (59 samples, 0.07%) 330 | 331 | 332 | [unknown] (59 samples, 0.07%) 333 | 334 | 335 | [unknown] (59 samples, 0.07%) 336 | 337 | 338 | [unknown] (59 samples, 0.07%) 339 | 340 | 341 | [unknown] (9 samples, 0.01%) 342 | 343 | 344 | do_IRQ (31 samples, 0.04%) 345 | 346 | 347 | [unknown] (59 samples, 0.07%) 348 | 349 | 350 | __clone (47 samples, 0.06%) 351 | 352 | 353 | [unknown] (59 samples, 0.07%) 354 | 355 | 356 | [unknown] (59 samples, 0.07%) 357 | 358 | 359 | [unknown] (59 samples, 0.07%) 360 | 361 | 362 | [unknown] (59 samples, 0.07%) 363 | 364 | 365 | update_process_times (28 samples, 0.03%) 366 | 367 | 368 | [unknown] (59 samples, 0.07%) 369 | 370 | 371 | [unknown] (59 samples, 0.07%) 372 | 373 | 374 | vfs_read (7 samples, 0.01%) 375 | 376 | 377 | [unknown] (59 samples, 0.07%) 378 | 379 | 380 | __perf_event_task_sched_in (135 samples, 0.17%) 381 | 382 | 383 | __do_softirq (20 samples, 0.02%) 384 | 385 | 386 | handle_irq_event_percpu (16 samples, 0.02%) 387 | 388 | 389 | [unknown] (59 samples, 0.07%) 390 | 391 | 392 | [unknown] (59 samples, 0.07%) 393 | 394 | 395 | rwsem_down_write_failed (12 samples, 0.01%) 396 | 397 | 398 | [unknown] (59 samples, 0.07%) 399 | 400 | 401 | hrtimer_interrupt (57 samples, 0.07%) 402 | 403 | 404 | sys_mmap_pgoff (18 samples, 0.02%) 405 | 406 | 407 | [unknown] (59 samples, 0.07%) 408 | 409 | 410 | [unknown] (59 samples, 0.07%) 411 | 412 | 413 | pipe_wait (7 samples, 0.01%) 414 | 415 | 416 | __read_nocancel (7 samples, 0.01%) 417 | 418 | 419 | [unknown] (59 samples, 0.07%) 420 | 421 | 422 | [unknown] (59 samples, 0.07%) 423 | 424 | 425 | finish_task_switch (137 samples, 0.17%) 426 | 427 | 428 | [unknown] (59 samples, 0.07%) 429 | 430 | 431 | native_write_msr_safe (47 samples, 0.06%) 432 | 433 | 434 | [unknown] (16 samples, 0.02%) 435 | 436 | 437 | perf_event_task_tick (9 samples, 0.01%) 438 | 439 | 440 | [unknown] (59 samples, 0.07%) 441 | 442 | 443 | finish_task_switch (10 samples, 0.01%) 444 | 445 | 446 | schedule_tail (47 samples, 0.06%) 447 | 448 | 449 | [unknown] (59 samples, 0.07%) 450 | 451 | 452 | [unknown] (59 samples, 0.07%) 453 | 454 | 455 | [unknown] (7 samples, 0.01%) 456 | 457 | 458 | [unknown] (59 samples, 0.07%) 459 | 460 | 461 | [unknown] (59 samples, 0.07%) 462 | 463 | 464 | iwl_trans_pcie_read32 (9 samples, 0.01%) 465 | 466 | 467 | [unknown] (59 samples, 0.07%) 468 | 469 | 470 | [unknown] (59 samples, 0.07%) 471 | 472 | 473 | [unknown] (59 samples, 0.07%) 474 | 475 | 476 | [unknown] (59 samples, 0.07%) 477 | 478 | 479 | [unknown] (59 samples, 0.07%) 480 | 481 | 482 | [unknown] (58 samples, 0.07%) 483 | 484 | 485 | [unknown] (58 samples, 0.07%) 486 | 487 | 488 | [unknown] (59 samples, 0.07%) 489 | 490 | 491 | iwl_isr_ict (9 samples, 0.01%) 492 | 493 | 494 | [unknown] (59 samples, 0.07%) 495 | 496 | 497 | [unknown] (59 samples, 0.07%) 498 | 499 | 500 | schedule (11 samples, 0.01%) 501 | 502 | 503 | run_rebalance_domains (8 samples, 0.01%) 504 | 505 | 506 | [unknown] (59 samples, 0.07%) 507 | 508 | 509 | apic_timer_interrupt (88 samples, 0.11%) 510 | 511 | 512 | [unknown] (59 samples, 0.07%) 513 | 514 | 515 | pthread_cond_wait@@GLIBC_2.3.2 (11 samples, 0.01%) 516 | 517 | 518 | intel_pmu_enable_all (10 samples, 0.01%) 519 | 520 | 521 | [unknown] (59 samples, 0.07%) 522 | 523 | 524 | [unknown] (58 samples, 0.07%) 525 | 526 | 527 | [unknown] (59 samples, 0.07%) 528 | 529 | 530 | system_call_fastpath (18 samples, 0.02%) 531 | 532 | 533 | [unknown] (59 samples, 0.07%) 534 | 535 | 536 | [unknown] (59 samples, 0.07%) 537 | 538 | 539 | [unknown] (11 samples, 0.01%) 540 | 541 | 542 | __schedule (12 samples, 0.01%) 543 | 544 | 545 | [unknown] (59 samples, 0.07%) 546 | 547 | 548 | futex_wait_queue_me (11 samples, 0.01%) 549 | 550 | 551 | task_tick_fair (8 samples, 0.01%) 552 | 553 | 554 | [unknown] (59 samples, 0.07%) 555 | 556 | 557 | perf_event_context_sched_in (10 samples, 0.01%) 558 | 559 | 560 | main::closure.2534 (80,064 samples, 99.83%) 561 | main::closure.2534 562 | 563 | 564 | [unknown] (59 samples, 0.07%) 565 | 566 | 567 | finish_task_switch (47 samples, 0.06%) 568 | 569 | 570 | hrtimer_wakeup (10 samples, 0.01%) 571 | 572 | 573 | [unknown] (59 samples, 0.07%) 574 | 575 | 576 | [unknown] (59 samples, 0.07%) 577 | 578 | 579 | [unknown] (59 samples, 0.07%) 580 | 581 | 582 | [unknown] (59 samples, 0.07%) 583 | 584 | 585 | [unknown] (59 samples, 0.07%) 586 | 587 | 588 | wake_up_process (10 samples, 0.01%) 589 | 590 | 591 | do_softirq (11 samples, 0.01%) 592 | 593 | 594 | __perf_event_task_sched_in (47 samples, 0.06%) 595 | 596 | 597 | [unknown] (59 samples, 0.07%) 598 | 599 | 600 | call_softirq (11 samples, 0.01%) 601 | 602 | 603 | do_sync_read (7 samples, 0.01%) 604 | 605 | 606 | run_timer_softirq (7 samples, 0.01%) 607 | 608 | 609 | rwsem_down_failed_common (7 samples, 0.01%) 610 | 611 | 612 | perf_event_context_sched_in (10 samples, 0.01%) 613 | 614 | 615 | call_softirq (20 samples, 0.02%) 616 | 617 | 618 | native_write_msr_safe (10 samples, 0.01%) 619 | 620 | 621 | [unknown] (59 samples, 0.07%) 622 | 623 | 624 | [unknown] (59 samples, 0.07%) 625 | 626 | 627 | ret_from_intr (31 samples, 0.04%) 628 | 629 | 630 | do_execve_common.isra.30 (9 samples, 0.01%) 631 | 632 | 633 | __execve (9 samples, 0.01%) 634 | 635 | 636 | [unknown] (59 samples, 0.07%) 637 | 638 | 639 | [unknown] (76 samples, 0.09%) 640 | 641 | 642 | [unknown] (59 samples, 0.07%) 643 | 644 | 645 | x86_pmu_enable (47 samples, 0.06%) 646 | 647 | 648 | __GI___mmap64 (18 samples, 0.02%) 649 | 650 | 651 | irq_exit (11 samples, 0.01%) 652 | 653 | 654 | [unknown] (59 samples, 0.07%) 655 | 656 | 657 | [unknown] (59 samples, 0.07%) 658 | 659 | 660 | [unknown] (59 samples, 0.07%) 661 | 662 | 663 | [unknown] (59 samples, 0.07%) 664 | 665 | 666 | [unknown] (59 samples, 0.07%) 667 | 668 | 669 | schedule (12 samples, 0.01%) 670 | 671 | 672 | [unknown] (59 samples, 0.07%) 673 | 674 | 675 | irq_exit (20 samples, 0.02%) 676 | 677 | 678 | sys_mmap (18 samples, 0.02%) 679 | 680 | 681 | intel_pmu_enable_all (10 samples, 0.01%) 682 | 683 | 684 | [unknown] (59 samples, 0.07%) 685 | 686 | 687 | [unknown] (59 samples, 0.07%) 688 | 689 | 690 | handle_edge_irq (17 samples, 0.02%) 691 | 692 | 693 | call_rwsem_down_write_failed (12 samples, 0.01%) 694 | 695 | 696 | entity_tick (7 samples, 0.01%) 697 | 698 | 699 | [unknown] (59 samples, 0.07%) 700 | 701 | 702 | [unknown] (59 samples, 0.07%) 703 | 704 | 705 | [unknown] (59 samples, 0.07%) 706 | 707 | 708 | __libc_start_main (16 samples, 0.02%) 709 | 710 | 711 | native_write_msr_safe (10 samples, 0.01%) 712 | 713 | 714 | [unknown] (59 samples, 0.07%) 715 | 716 | 717 | __run_hrtimer (50 samples, 0.06%) 718 | 719 | 720 | -------------------------------------------------------------------------------- /rust_counter_atomics.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | use std::sync::atomic::{AtomicUint, Relaxed}; 3 | 4 | const NUM_THREADS: uint = 20; 5 | const NUM_INCREMENTS: uint = 1000000u; 6 | 7 | fn main() { 8 | let counter = Arc::new(AtomicUint::new(0)); 9 | let (tx, rx) = channel(); 10 | for _ in range(0u, NUM_THREADS) { 11 | let (counter, tx) = (counter.clone(), tx.clone()); 12 | spawn(proc() { 13 | for _ in range(0u, NUM_INCREMENTS) { 14 | counter.fetch_add(1, Relaxed); 15 | } 16 | tx.send(()); 17 | }) 18 | } 19 | // Wait for threads to finish 20 | for _ in range(0u, NUM_THREADS) { rx.recv(); } 21 | println!("{}" , counter.load(Relaxed)); 22 | } 23 | -------------------------------------------------------------------------------- /rust_counter_mutex.rs: -------------------------------------------------------------------------------- 1 | use std::sync::{Arc, Mutex}; 2 | const NUM_THREADS: uint = 20; 3 | const NUM_INCREMENTS: uint = 1000000u; 4 | 5 | fn main() { 6 | let data = Arc::new(Mutex::new(0u)); 7 | let (tx, rx) = channel(); 8 | for _ in range(0u, NUM_THREADS) { 9 | let (data, tx) = (data.clone(), tx.clone()); 10 | spawn(proc() { 11 | for _ in range(0u, NUM_INCREMENTS) { 12 | let mut d = data.lock(); 13 | *d += 1; 14 | } 15 | tx.send(()); 16 | }) 17 | } 18 | // Wait for threads to finish 19 | for _ in range(0u, NUM_THREADS) { rx.recv(); } 20 | let d = data.lock(); 21 | println!("{}" , *d); 22 | } 23 | --------------------------------------------------------------------------------