|
|
在debian下写了个接入mysql进行读写操作的程序,代码附后。虽然对单独的线程都在运行后延时了一会让它不霸占,但实际运行起来还是很容易被tread1,特别是thread3霸占,请问如何能让四个线程比较公平的使用资源,谢谢
#include <mysql.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
int t;
pthread_mutex_t my_mutex;
pthread_mutex_init(my_mutex);
struct timespec delay;
delay.tv_sec = 1;
delay.tv_nec = 0;
void Myupdate();
void Myupdate2();
void Myselect();
void Myselect2();
int main()
{
pthread_t thread1,thread3,thread2,thread4;
int iret1,iret2,iret3,iret4;
mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"localhost", "test", "test", "test",0,NULL,0))
{
printf( "Error connecting to database: %s\n",mysql_error(&mysql));
return 1;
}
else printf("Connected...\n");
iret1= pthread_create( &thread1, NULL, Myupdate, NULL);
iret2= pthread_create( &thread2, NULL, Myupdate2, NULL);
iret3= pthread_create( &thread3, NULL, Myselect, NULL);
iret4= pthread_create( &thread4, NULL, Myselect2, NULL);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
pthread_join( thread3, NULL);
pthread_join( thread4, NULL);
mysql_close(&mysql);
return 0;
}
void Myselect()
{ while(1)
{
pthread_mutex_lock(&my_mutex);
query = "select * from ttable where id=1";
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
printf("Error making query: %s\n",
mysql_error(&mysql));
return 1;
}
else printf("[%s] made...\n", query);
res = mysql_store_result(&mysql);
while(row = mysql_fetch_row(res))
{
for(t=0;t<mysql_num_fields(res);t++)
{
printf("%s ",row[t]);
}
printf("\n");
}
printf("mysql_free_result...\n");
mysql_free_result(res);
pthread_mutex_unlock(&my_mutex);
pthread_delay_np(&delay);
}
}
void Myselect2()
{ while(1)
{
pthread_mutex_lock(&my_mutex);
query = "select * from ttable where id=2";
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
printf("Error making query: %s\n",
mysql_error(&mysql));
return 1;
}
else printf("[%s] made...\n", query);
res = mysql_store_result(&mysql);
while(row = mysql_fetch_row(res))
{
for(t=0;t<mysql_num_fields(res);t++)
{
printf("%s ",row[t]);
}
printf("\n");
}
printf("mysql_free_result...\n");
mysql_free_result(res);
pthread_mutex_unlock(&my_mutex);
pthread_delay_np(&delay);
}
}
void Myupdate()
{while(1)
{
pthread_mutex_lock(&my_mutex);
query = "insert into ttable(id, value) values(1, 'Update from thread 1')";
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
printf("Error making query: %s\n",
mysql_error(&mysql));
return 1;
}
else printf("[%s] made...\n", query);
pthread_mutex_unlock(&my_mutex);
pthread_delay_np(&delay);
}
}
void Myupdate2()
{while(1)
{
pthread_mutex_lock(&my_mutex);
query = "insert into ttable(id, value) values(2, 'Update from thread 2')";
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
printf("Error making query: %s\n",
mysql_error(&mysql));
return 1;
}
else printf("[%s] made...\n", query);
pthread_mutex_unlock(&my_mutex);
pthread_delay_np(&delay);
}
} |
|