×
sc_buffer is a predefined primitive channel derived from class sc_signal.
It differs from class sc_signal in that a value-changed event is notified whenever the buffer is written rather than only when the value of the signal is changed. 
E.g.,
if current value of a "signal" == 1: write 1 to it won't trigger value update event.
if current value of a "buffer" == 1: write 1 to it will trigger value update event.
run
Learn with Examples, 2020, MIT license
#include <systemc>
using namespace sc_core;
SC_MODULE(BUFFER) {
declares a signal channel
  sc_signal<int> s;
declares a buffer channel
  sc_buffer<int> b;
  SC_CTOR(BUFFER) {
writes to both signal and buffer
    SC_THREAD(writer);
    SC_THREAD(consumer1);
triggered by signal
    sensitive << s;
    dont_initialize();
    SC_THREAD(consumer2);
triggered by buffer
    sensitive << b;
    dont_initialize();
  }
  void writer() {
init value
    int val = 1;
    while (true) {
write same value to channel twice
      for (int i = 0; i < 2; ++i) {
write to signal
        s.write(val);
write to buffer
        b.write(val);
wait after 1 s
        wait(1, SC_SEC);
      }
value change
      val++;
    }
  }
  void consumer1() {
    while (true) {
      std::cout << sc_time_stamp() << ": consumer1 receives " << s.read() << std::endl;
receives from signal
      wait();
    }
  }
  void consumer2() {
    while (true) {
      std::cout << sc_time_stamp() << ": consumer2 receives " << b.read() << std::endl;
receives from buffer
      wait();
    }
  }
};
int sc_main(int, char*[]) {
  BUFFER buffer("buffer");
  sc_start(4, SC_SEC);
  return 0;
}
Result:
receives 1 from signal channel once
0 s: consumer1 receives 1
receives 1 from buffer channel once
0 s: consumer2 receives 1
receives 1 from buffer channel twice
1 s: consumer2 receives 1
receives 2 from signal channel once
2 s: consumer1 receives 2
receives 2 from buffer channel once
2 s: consumer2 receives 2
receives 2 from buffer channel twice
3 s: consumer2 receives 2