对条件变量的用法的说明可以见这里,http://www.wuzesheng.com/?p=1668,写的不错,看一个裸写的无封装的用法如下:
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <queue>
#include <string>
#define _PRINTF_(format, ...) printf("[%s][%05ld] " format " [%s::%s::%d]\n", getdatetimestr(), syscall(__NR_gettid), ##__VA_ARGS__, __FILE__, __FUNCTION__, __LINE__)
char* getdatetimestr() {
static char datetimestr[32] = {0};
static time_t last_update_time = 0;
struct timeval tv = {0};
gettimeofday(&tv, NULL);
time_t nowtime = tv.tv_sec;
if (nowtime != last_update_time) {
last_update_time = nowtime;
struct tm nowtm = {0};
localtime_r(&nowtime, &nowtm);
strftime(datetimestr, sizeof(datetimestr), "%Y-%m-%d %H:%M:%S", &nowtm);
}
snprintf(datetimestr+19, sizeof(datetimestr)-19, ".%06ld", tv.tv_usec);
return datetimestr;
}
std::queue<std::string> task_queue;
pthread_mutex_t mutex_t = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_t = PTHREAD_COND_INITIALIZER;
void* thread_func1(void*) {
_PRINTF_("producer");
while (1) {
//int sleep_sec = rand() % 5;
//_PRINTF_("sleep %d sec", sleep_sec);
//sleep(sleep_sec);
_PRINTF_("waiting for mutex_t");
pthread_mutex_lock(&mutex_t);
std::string datetimestr = getdatetimestr();
task_queue.push(datetimestr);
_PRINTF_("put %s queue size %lu", datetimestr.c_str(), task_queue.size());
pthread_cond_signal(&cond_t);
pthread_mutex_unlock(&mutex_t);
}
return NULL;
}
void* thread_func2(void* args) {
char* indent = (char*)args;
_PRINTF_("%s" "customer", indent);
while (1) {
//int sleep_sec = rand() % 5;
//_PRINTF_("%s" "sleep %d sec", indent, sleep_sec);
//sleep(sleep_sec);
_PRINTF_("%s" "waiting for mutex_t", indent);
pthread_mutex_lock(&mutex_t);
while (task_queue.empty()) {
pthread_cond_wait(&cond_t, &mutex_t);
}
std::string datetimestr = task_queue.front();
_PRINTF_("%s" "got %s queue size %lu", indent, datetimestr.c_str(), task_queue.size());
task_queue.pop();
pthread_mutex_unlock(&mutex_t);
}
return NULL;
}
int main() {
_PRINTF_("start");
srand(time(NULL));
pthread_t thread_t1 = {0};
if (pthread_create(&thread_t1, NULL, thread_func1, NULL) != 0) {
_PRINTF_("%m");
return -1;
}
_PRINTF_("create thread 1 success");
pthread_t thread_t21 = {0};
char* indent21 = "\t";
if (pthread_create(&thread_t21, NULL, thread_func2, (void*)indent21) != 0) {
_PRINTF_("%m");
return -1;
}
_PRINTF_("create thread 2 success");
pthread_t thread_t22 = {0};
char* indent22 = "\t\t";
if (pthread_create(&thread_t22, NULL, thread_func2, (void*)indent22) != 0) {
_PRINTF_("%m");
return -1;
}
_PRINTF_("create thread 22 success");
pthread_t thread_t23 = {0};
char* indent23 = "\t\t\t";
if (pthread_create(&thread_t23, NULL, thread_func2, (void*)indent23) != 0) {
_PRINTF_("%m");
return -1;
}
_PRINTF_("create thread 23 success");
pthread_join(thread_t1, NULL);
pthread_join(thread_t21, NULL);
pthread_join(thread_t22, NULL);
pthread_join(thread_t23, NULL);
_PRINTF_("end");
return 0;
}