拳銃や手榴弾を用いての近距離戦闘も白兵戦に含める場合がある。また、ゲリラ戦においては、火器や弾薬の不足、あるいは敵に気付かれないよう音を出したくないなどの理由から、白兵戦が選択されることもある。近代戦における白兵戦は、銃撃の後の最終的な突撃や、塹壕内における戦闘の際に行われることが多い。歩兵の主力銃がボルトアクション式の時代までは、装填間隔の長さから至近距離で複数の敵と銃で渡り合えない限界を、銃剣や格闘などで補っていた。第一次世界大戦で機関銃が大々的に使用され、見通しのよい場所は火力で制圧されてしまうようになった。従来行われていた正面からの銃剣突撃や騎兵突撃は困難になった。これにより、歩兵の白兵戦は着剣小銃で槍衾をつくることから、塹壕や室内などの出会い頭の戦闘を行うことへと変わった。第一次世界大戦では塹壕戦となり、馬上まで届くような長い着剣小銃では取り回しが悪く、拳銃は扱いが難しかったため、代わってスコップ、ナイフでの斬り合い刺し合いとなり、果てはヘルメットや、手製の棍棒で殴り合うことすら珍しくなかった。また、トレンチナイフという専用の武器まで作られた。しかし、大戦末期には近接戦闘に特化した短機関銃が実用化され、近接戦闘においても銃火器が優位を大きくした。続く第二次世界大戦末期には突撃銃（アサルトライフル）が実用化され、歩兵銃も近接戦闘能力を高めたため、白兵戦はごく限定的なものとなった。近年の対テロ作戦で、近接戦闘の機会が再び増加したが、これも旧来の白兵戦ではなく、建物内の犯人を的確に射殺する事がメインであり、これに適した小型の火器やサプレッサーの導入が進んでいる。格闘術の訓練を廃止した軍隊も存在するが、接近戦への対応を目的とした格闘術自体は無くなっていない。イギリス軍では、第二次大戦中に格闘術フェアバーン・システムを訓練しており、フォークランド戦争とイラク戦争では銃剣突撃を実施した。アメリカ陸軍での格闘術訓練は減少しているが、アメリカ海兵隊は、冷戦期にフィリピン武術「カリ」に伝わる棒術の技を基にした銃剣術を新たに制定し、現在でも兵科を問わず銃剣術や格闘術の訓練を実施している。イスラエルでは、格闘術「クラヴ・マガ」が軍の特殊部隊や警察の対テロリスト部隊で訓練されている。軍の予算が不十分な場合、低予算でも訓練可能な白兵戦が訓練項目として注目される場合もあり、隊員の戦意高揚にも役立つといわれる。本来の定義からは外れるが、現代戦では大砲・ミサイルなどによる距離を置いた砲撃戦と対比して（特に航空機・艦艇などの乗員がやむなく拳銃や軽機関銃で）、近距離の銃撃戦を行う場合などにも「白兵戦」という言葉が使われることがある。また、珍しい場合では珊瑚海海戦において大日本帝国海軍の航空母艦翔鶴の搭載機が米空母に着艦しかけるという事態が起きており、米空母側では何の迷いもなく着艦コースに入る敵機にパニックになったらしく、副長が白兵戦用意の号令をかけている。無論、空母でこんな命令が出されたのはこれが史上唯一である。このようなことが起きた原因としては、パイロットの練度のほか、長時間に及ぶ飛行と戦闘による疲労、夕暮れ時で見えづらかった事、翔鶴型航空母艦とヨークタウン級航空母艦の大きさがほぼ同じ事等が考えられる。
RCUはいろいろな使い方があるが、一般的な使い方はリーダー・ライターロックに近い。以下のふたつのコードはリーダー・ライターロック(左側)とRCU(右側)を同じ処理で使ったものである。 1 struct el {                           1 struct el { 2   struct list_head lp;                2   struct list_head lp; 3   long key;                           3   long key; 4   spinlock_t mutex;                   4   spinlock_t mutex; 5   int data;                           5   int data; 6   /* Other data fields */             6   /* Other data fields */ 7 };                                    7 }; 8 DEFINE_RWLOCK(listmutex);             8 DEFINE_SPINLOCK(listmutex); 9 LIST_HEAD(head);                      9 LIST_HEAD(head); 1 int search(long key, int *result)     1 int search(long key, int *result) 2 {                                     2 { 3   struct el *p;                       3   struct el *p; 4                                       4 5   read_lock(&listmutex);              5   rcu_read_lock(); 6   list_for_each_entry(p, &head, lp) { 6   list_for_each_entry_rcu(p, &head, lp) { 7     if (p->key == key) {              7     if (p->key == key) { 8       *result = p->data;              8       *result = p->data; 9       read_unlock(&listmutex);        9       rcu_read_unlock();10       return 1;                      10       return 1;11     }                                11     }12   }                                  12   }13   read_unlock(&listmutex);           13   rcu_read_unlock();14   return 0;                          14   return 0;15 }                                    15 } 1 int delete(long key)                  1 int delete(long key) 2 {                                     2 { 3   struct el *p;                       3   struct el *p; 4                                       4 5   write_lock(&listmutex);             5   spin_lock(&listmutex); 6   list_for_each_entry(p, &head, lp) { 6   list_for_each_entry(p, &head, lp) { 7     if (p->key == key) {              7     if (p->key == key) { 8       list_del(&p->lp);               8       list_del_rcu(&p->lp); 9       write_unlock(&listmutex);       9       spin_unlock(&listmutex);                                        10       synchronize_rcu();10       kfree(p);                      11       kfree(p);11       return 1;                      12       return 1;12     }                                13     }13   }                                  14   }14   write_unlock(&listmutex);          15   spin_unlock(&listmutex);15   return 0;                          16   return 0;16 }                                    17 }両者の違いは非常に小さい。参照側のロックは rcu_read_lock() と rcu_read_unlock() になり、更新側のロックはリーダー・ライターロックから単純なスピンロックに変更され、kfree()を実行するまえに synchronize_rcu() が呼び出される。しかし、この場合参照側と更新側が同時に動作する可能性が出てくる。多くの場合はこれは問題とはならないが、使われ方を十分注意する必要がある。たとえば、複数の独立したリストをアトミックに更新しなければならない場合、これをRCUに置き換えるには注意が必要である。synchronize_rcu() があるということはRCUでは delete() がブロックされる可能性があることを示す。それが問題となる場合は代わりに call_rcu() を call_rcu (kfree, p) のように使用すればよい。これは参照カウントと組合わせる場合に特に便利である。