Skip to content

Instantly share code, notes, and snippets.

@frsyuki
Created March 30, 2010 08:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save frsyuki/348889 to your computer and use it in GitHub Desktop.
Save frsyuki/348889 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include <pthread.h>
#include <libmemcached/memcached.h>
const char* g_host = "127.0.0.1";
unsigned short g_port = 11211;
bool g_binary = false;
const char* g_key = "test";
size_t g_key_len = 4;
unsigned int g_loop = 1000;
unsigned int g_threads = 100;
static memcached_st* create_st()
{
memcached_st* st = memcached_create(NULL);
if(!st) {
perror("memcached_create failed");
exit(1);
}
char* hostbuf = strdup(g_host);
memcached_server_add(st, hostbuf, g_port);
free(hostbuf);
if(g_binary) {
memcached_behavior_set(st, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
}
return st;
}
static void* worker(void* trash)
{
int i;
uint64_t value;
memcached_st* st = create_st();
for(i=0; i < g_loop; ++i) {
memcached_increment(st, g_key, g_key_len, 1, &value);
}
memcached_free(st);
return NULL;
}
int main(int argc, char* argv[])
{
{
memcached_return ret;
memcached_st* st = create_st();
ret = memcached_set(st, g_key, g_key_len, "0",1, 0, 0);
if(ret != MEMCACHED_SUCCESS) {
fprintf(stderr, "set failed: %s\n", memcached_strerror(st, ret));
}
memcached_free(st);
}
{
int i;
pthread_t threads[g_threads];
for(i=0; i < g_threads; ++i) {
int err = pthread_create(&threads[i], NULL, worker, NULL);
if(err != 0) {
fprintf(stderr, "failed to create thread: %s\n", strerror(err));
exit(1);
}
}
for(i=0; i < g_threads; ++i) {
void* ret;
int err = pthread_join(threads[i], &ret);
if(err != 0) {
fprintf(stderr, "failed to join thread: %s\n", strerror(err));
}
}
}
{
memcached_return ret;
char* value;
size_t vallen;
uint32_t flags;
memcached_st* st = create_st();
value = memcached_get(st, g_key, g_key_len,
&vallen, &flags, &ret);
if(ret != MEMCACHED_SUCCESS) {
fprintf(stderr, "get failed: %s\n", memcached_strerror(st, ret));
}
printf("expected: %d\n", g_threads * g_loop);
printf("result: %s\n", value);
memcached_free(st);
}
return 0;
}
////
// result:
//
// $ memcached -U 0 -p 11211 -t 4 -d
//
// $ ./a.out
// expected: 100000
// result: 99996
//
// $ ./a.out
// expected: 100000
// result: 99998
//
// $ ./a.out
// expected: 100000
// result: 99998
//
// - Mac OS X 10.6.2 (Snow Leopard)
// - memcached-1.4.4 (Mach-O 64-bit executable x86_64)
// - libevent-1.4.13
// - libmemcached-0.37
//
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment