我有一個相當奇怪的問題,盡管將關鍵代碼部分鎖定在我正在啟動的執行緒中,但我沒有得到正確的結果 -
#include <stdio.h>
#include <pthread.h>
#include <thread>
#include <mutex>
#define NUMTAGS 6
std::mutex foo,bar;
pthread_mutex_t mutex;
typedef struct PKT{
int ii;
int jj;
}pkt;
void *print(void *pk)
{
pthread_mutex_lock(&mutex);
pkt *x = (pkt *)pk;
printf("--> %d %d %d\n", x->ii, x->jj, x->ii*NUMTAGS x->jj);
pthread_mutex_unlock(&mutex);
}
int main(int argc, char **argv)
{
int count = 3;
int ii, jj;
pthread_t t_id[count*NUMTAGS];
int t_status[count*NUMTAGS];
pkt p;
pkt *p_p = &p;
for(ii=0; ii < count; ii =1){
for(jj=0; jj < NUMTAGS; jj =1){
p.ii = ii;
p.jj = jj;
//printf("<> %d %d %d\n", p_p->ii, p_p->jj, p_p->ii*NUMTAGS p_p->jj);
t_status[ii*NUMTAGS jj]=pthread_create(&t_id[ii*NUMTAGS jj], NULL, print, (void*)p_p);
}
}
for(ii=0; ii < count; ii =1){
for(jj=0; jj < NUMTAGS; jj =1){
pthread_join(t_id[ii*NUMTAGS jj], NULL);
}
}
}
結果答案是隨機錯誤的......
--> 0 3 3
--> 1 0 6
--> 1 0 6
--> 1 0 6
--> 1 0 6
--> 1 0 6
--> 1 1 7
--> 1 2 8
--> 1 3 9
--> 1 5 11
--> 2 0 12
--> 2 0 12
--> 2 1 13
--> 2 3 15
--> 2 4 16
--> 2 5 17
--> 2 5 17
--> 2 5 17
有人能告訴我啟動列印執行緒并讓正文原子執行的正確方法是什么嗎?
謝謝,拉吉
uj5u.com熱心網友回復:
你有兩個問題:
首先,執行的執行緒main修改p.ii并且p.jj不持有互斥鎖。因此,當您創建的執行緒進入 read iiandjj時,任何事情都可能發生,因為它們可能正在被修改。
其次,不清楚您期望什么行為以及為什么。您看到的輸出是完全合理的。您說這是“錯誤的”,但不解釋為什么是錯誤的。您不會強制在運行的執行緒main和列印執行緒之間進行任何排序。正在運行的執行緒main可能會設法更改ii,并且jj在創建的執行緒設法運行之前多次更改。
為什么您認為列印相同內容的兩個執行緒是“錯誤的”?你認為是什么迫使第一個執行緒在main執行緒修改之前完成ii并且jj不止一次?
uj5u.com熱心網友回復:
謝謝大衛,在你發表評論后,我修改了我的代碼,它現在可以作業了 -
#include <stdio.h>
#include <pthread.h>
#include <thread>
#include <mutex>
#define NUMTAGS 6
std::mutex foo,bar;
pthread_mutex_t mutex;
typedef struct PKT{
int ii;
int jj;
}pkt;
void *print(void *pk)
{
pthread_mutex_lock(&mutex);
pkt *x = (pkt *)pk;
printf("--> %d %d %d\n", x->ii, x->jj, x->ii*NUMTAGS x->jj);
pthread_mutex_unlock(&mutex);
}
int main(int argc, char **argv)
{
int count = 3;
int ii, jj;
pthread_t t_id[count*NUMTAGS];
int t_status[count*NUMTAGS];
pkt p[count*NUMTAGS];
pkt *p_p = p;
/*pre-assigned structure before launching thread*/
for(ii=0; ii < count; ii =1){
for(jj=0; jj < NUMTAGS; jj =1){
p[NUMTAGS*ii jj].ii= ii;
p[NUMTAGS*ii jj].jj= jj;
}
}
for(ii=0; ii < count; ii =1){
for(jj=0; jj < NUMTAGS; jj =1){
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
//printf("<> %d %d %d\n", p_p->ii, p_p->jj, p_p->ii*NUMTAGS p_p->jj);
t_status[ii*NUMTAGS jj]=pthread_create(&t_id[ii*NUMTAGS jj], NULL, print, (void*)p_p);
p_p =1;
}
}
for(ii=0; ii < count; ii =1){
for(jj=0; jj < NUMTAGS; jj =1){
pthread_join(t_id[ii*NUMTAGS jj], NULL);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413494.html
標籤:
