Producer-Consumer in C++ - follow-up
Global variables in the best of cases are questionable, but in this case especially you have buff_size as a global variable. buff_size is only used in main() so should be a local variable there. 

You can also take advantage of the fact that std::condition_variable::wait() has another overload that takes a predicate to replace:

while (count == 0) {
    cv.wait(lck);
}


with:

cv.wait(lck, []{ return count &gt; 0; });


Although, did you really want every consumer to print out every letter every time? If buff_size were 10, you'd end up logging 55 letters. Was that intentional? If it wasn't, you could drop count entirely, switch data to be a std::queue and have your consumer be:

std::unique_lock&lt;std::mutex&gt; lck(mtx);
cv.wait(lck, []{return !data.empty(); });
std::cout &lt;&lt; data.front() &lt;&lt; std::endl;
data.pop();


On the producer front, did you really mean notify_one() and not notify_all()? Let all the consumers fight for the lock!

Lastly, this:

if (buff_size &lt; 0) {
    buff_size = 0;
}
else if (buff_size &gt; 26) {
    buff_size = 26;
}


is a clamp. It might be worth writing something like:

template &lt;typename T&gt;
T clamp(T const&amp; val, T const&amp; lo, T const&amp; hi)
{
    return std::min(std::max(val, lo), hi);
}

buff_size = clamp(buff_size, 0, 26);