我有一個線程可以鎖定互斥鎖,將值寫入變量,解鎖互斥鎖。 我在這裏打印出來並且值已經改變了。我將它設置爲1。線程同步
當我使用鎖定,解鎖互斥和讀出的值在另一個線程讀取的變量值,我得到的0
舊值爲什麼會發生這種情況。我正確鎖定和解鎖相同的互斥鎖。
如何同步線程?
編輯:
我宣佈互斥,在這裏變量
static pthread_mutex_t movementIdMutex = PTHREAD_MUTEX_INITIALIZER;
static int nav_movementId = 0;
static pthread_mutex_t newMovementMutex = PTHREAD_MUTEX_INITIALIZER;
static int nav_newMovement = 0;
我這裏
void nav_setMovementIdentifier(int id)
{
printf("Received movement id:%d from connectivity\n", id);
int result; /* Use the result for testing */
result = pthread_mutex_lock(&movementIdMutex);
nav_movementId = id;
printf("nav_movementId is %d\n", nav_movementId);
result = pthread_mutex_unlock(&movementIdMutex);
result = pthread_mutex_lock(&newMovementMutex);
nav_newMovement = 1;
printf("nav_newMovement is %d in the setId function\n", nav_newMovement);
result = pthread_mutex_unlock(&newMovementMutex);
printf("\n");
}
設置變量,並在這裏閱讀他們
void *startConnectivityListener(void *ptr) {
/* Declare safety variables because segments cant be locked/unlocked
* using mutexes if they are checking in statement such as if and while.
*/
int newMoveCheck = 0;
int startIndoorCheck = 0;
int startOutdoorCheck = 0;
int listening = 1;
while(listening == 1)
{
int result; /* Use for testing */
/* check if a new movement command waits */
result = pthread_mutex_lock(&newMovementMutex);
newMoveCheck = nav_newMovement;
printf("nav new movement in thread is :%d\n", nav_newMovement);
printf("newMoveCheck in mutex lock is:%d\n", newMoveCheck);
result = pthread_mutex_unlock(&newMovementMutex);
result = pthread_mutex_lock(&movementIdMutex);
printf("nav_movementId in thread is %d\n", nav_movementId);
result = pthread_mutex_unlock(&movementIdMutex);
printf("newMoveCheck is %d\n", newMoveCheck);
sleep(1);
if(newMoveCheck == 1)
我得到的正確的pri在setter函數printf語句中,它將值設置爲傳入並且設置爲1的id。
當我嘗試打印它時,我仍然在讀取它們,它們仍然顯示0,這是它們被設置爲當我初始化他們。
需要查看一些代碼,以便我們可以知道問題的出現位置 – 2011-05-16 15:36:34
您能否提供可複製問題的可編譯示例? – janneb 2011-05-16 15:37:31
我加了相關的代碼。 :) – jarryd 2011-05-16 15:48:17