我正在处理一个较大的项目,该项目包括两个线程,两个线程之间共享一个数据库。一个线程的工作是只是倒计时每个活动元素的计时器,当该元素的计时器为零时,应将其设置为不活动并将其归零。
主线程只是以某种方式操纵活动元素的其他变量。
我不确定如何同步这些线程,尤其是当计时器达到零时,计时器线程会清理数据库元素。现在,我相信在mutex
的{{1}}循环中解锁和锁定while(1)
之间的时间可能太快了?
如果定时器线程正在等待main()
在mutex
处解锁;并在pthread_mutex_lock()
中解锁,我们是否知道定时器线程将是锁定main()
的下一个线程,或者mutex
可能是如此之快以至于它由于main()
和pthread_mutex_unlock()
之间没有任务,再次锁定了它吗?
我没有使用条件变量的经验,这可能是个好主意吗?
这是我的更大项目的最小工作示例。
pthread_mutex_lock()
main()函数
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <time.h>
#define NUM_COMPUTER 10
typedef struct computer
{
unsigned int active;
unsigned int timer;
int x;
}computer_t;
/**
* Function declarations
*/
void activate(computer_t* comp);
void* timerFunction(void* args);
/**
* Global variables
*/
computer_t database[NUM_COMPUTER];
pthread_mutex_t mutex;
其他功能
/**
* Main
*/
int main(void)
{
memset(database,sizeof database);
// Initialize some database elements
activate(database);
database[0].x = 5;
activate(database + 3);
database[3].x = 23;
activate(database + 9);
database[9].x = -7;
pthread_t timer_thread;
pthread_create(&timer_thread,NULL,timerFunction,NULL);
while(1)
{
/**
* MAY PROBLEMS OCCUR HERE? UNLOCKING AND LOCKING ALMOST DIRECTLY
*/
// ************* LOCK *************
pthread_mutex_lock(&mutex);
/**
* Manipulate struct members
*/
for (int i = 0; i < NUM_COMPUTER; i++)
{
if (database[i].active)
{
database[i].x += 1;
}
}
// ************* UNLOCK *************
pthread_mutex_unlock(&mutex);
}
return 0;
}