Là biến toàn cầu xấu? [đóng cửa]


247

Trong C / C ++, các biến toàn cầu có tệ như giáo sư của tôi nghĩ không?


17
Tôi sẽ cắn trong trường hợp anh ta cố gắng kể một câu chuyện cười ... "họ tệ đến mức nào"?
Zach Scrivena

13
Tôi nghĩ rằng câu hỏi này là khá thú vị! Phát triển phần mềm vẫn phải đối mặt với những cạm bẫy cũ kể từ khi bắt đầu và các lập trình viên thường vẫn không biết rằng sử dụng biến toàn cục, gotos, biến có tên ngắn KHÔNG phải là vấn đề. Mã xấu được viết mỗi ngày mà không sử dụng chúng. +1
Sylvain Coleue

69
Làm thế nào chúng ta có thể trả lời? Anh ấy đã không nói với chúng tôi rằng giáo sư của anh ấy nghĩ họ tệ đến mức nào. :)
Steve Fallows

9
@Juan Mendes Tôi đồng ý 100% với bạn! Vấn đề tôi đã nói đến là nhiều nhà phát triển biết rằng họ không nên sử dụng các biến toàn cầu nhưng họ chỉ không biết tại sao! Và do đó, tôi đã thấy nhiều phần mềm lớn trong đó mỗi và mọi chức năng đều nhận được cùng một cấu trúc mega chứa các trường +100 - Nhìn mẹ, không có biến toàn cục! Vấn đề tương tự như cái gọi là "thực hành tốt": chúng là những thực tiễn tốt trong MỘT SỐ bối cảnh, không phải trong tất cả bối cảnh. Sử dụng chúng CÓ THỂ tạo mã không thể nhầm lẫn. Chúc mừng.
Sylvain

3
Có rất ít sử dụng tốt cho các biến toàn cầu. Một cách sử dụng có thể, nhưng gây tranh cãi, sẽ là một đối tượng "cấu hình" toàn cầu, đọc trong tệp cấu hình một lần khi khởi động.
Im lặng

Câu trả lời:


256

Vấn đề với các biến toàn cục là vì mọi hàm đều có quyền truy cập vào các biến này, nên ngày càng khó để tìm ra hàm nào thực sự đọc và ghi các biến này.

Để hiểu cách ứng dụng hoạt động, bạn phải tính đến mọi chức năng thay đổi trạng thái toàn cầu. Điều đó có thể được thực hiện, nhưng khi ứng dụng phát triển, nó sẽ trở nên khó khăn hơn đến mức gần như không thể (hoặc ít nhất là hoàn toàn lãng phí thời gian).

Nếu bạn không dựa vào các biến toàn cục, bạn có thể chuyển trạng thái xung quanh giữa các chức năng khác nhau khi cần. Bằng cách đó, bạn có cơ hội hiểu rõ hơn về từng chức năng, vì bạn không cần phải tính đến trạng thái toàn cầu.


9
Câu trả lời này thực sự tốt. Kết hợp điều này với câu trả lời 'tối thiểu hóa phạm vi biến' stackoverflow.com/questions/357187/ trên
bobobobo

17
Thay thế 'lớp' cho 'ứng dụng' và state trạng thái đối tượng 'cho state trạng thái toàn cầu' và bạn đưa ra chính xác cùng một đối số cho việc không sử dụng các biến thành viên (còn gọi là các trường) trong các lớp. Câu trả lời thực sự là sử dụng chúng khi thích hợp.
Ian Goldby

2
Vài câu hỏi (có lẽ ngớ ngẩn): 1) Nếu bạn muốn biết hàm nào đọc và viết các biến này, bạn không thể sử dụng hàm "find" trong trình chỉnh sửa để phát hiện các trường hợp trong đó các giá trị trong các biến này được sửa đổi? 2) "Điều đó có thể được thực hiện, ... hoàn toàn lãng phí thời gian)." Bạn có thể đưa ra một ví dụ không? 3) "Nếu bạn không dựa vào các biến toàn cầu, ... bạn không cần phải tính đến trạng thái toàn cầu." Tôi không hiểu đó là một lợi thế như thế nào. Có lẽ một ví dụ về điều đó sẽ làm việc cho tôi.
Andrei

2
@bobobobo liên kết bị hỏng, chúng tôi có thể lấy ảnh chụp màn hình từ bạn, người dùng 10k + không?
noɥʇʎԀʎzɐɹƆ

3
@ noɥʇʎԀʎzɐɹƆ Bạn đi đây! i.imgur.com/RwRgJLZ.jpg
Mateen Ulhaq

85

Điều quan trọng là phải nhớ mục tiêu tổng thể: sự rõ ràng

Quy tắc "không có biến toàn cục" là có bởi vì hầu hết thời gian, các biến toàn cục làm cho ý nghĩa của mã không rõ ràng.

Tuy nhiên, giống như nhiều quy tắc, mọi người nhớ quy tắc, và không phải những gì quy tắc được dự định làm.

Tôi đã thấy các chương trình dường như tăng gấp đôi kích thước của mã bằng cách chuyển một số lượng lớn các tham số xung quanh chỉ đơn giản là để tránh sự xấu xa của các biến toàn cục. Cuối cùng, việc sử dụng toàn cầu sẽ giúp chương trình rõ ràng hơn với những người đọc nó. Bằng cách vô thức tuân thủ từ của quy tắc, lập trình viên ban đầu đã thất bại trong ý định của quy tắc.

Vì vậy, vâng, toàn cầu thường là xấu. Nhưng nếu bạn cảm thấy rằng cuối cùng, ý định của lập trình viên được làm rõ hơn bằng cách sử dụng các biến toàn cục, thì hãy tiếp tục. Tuy nhiên, hãy nhớ sự giảm độ rõ ràng sẽ tự động xảy ra khi bạn buộc ai đó truy cập vào đoạn mã thứ hai (toàn cầu) để hiểu cách hoạt động của đoạn đầu tiên.


8
Đề xuất sử dụng toàn cầu thay vì chuyển các biến là một công thức để làm cho mã của bạn không thể sử dụng lại và không an toàn cho đa luồng
Juan Mendes

16
Đề xuất toàn cầu trong các trường hợp phù hợp là một công thức cho mã hiệu suất cao hơn và rõ ràng hơn. "Vượt qua" đòi hỏi phân bổ bộ nhớ động ngăn xếp liên tục và điều này sẽ thật ngớ ngẩn đối với một thứ gì đó phải là toàn cầu, chẳng hạn như bộ đệm toàn cầu cho dữ liệu ổ cắm đến. Ví dụ: nếu bạn có một hàm đọc Winsock recv (), tại sao liên tục tạo và giải phóng bộ đệm này trong mỗi cuộc gọi? Làm cho bộ đệm một toàn cầu. Nhiều chủ đề sẽ không được đọc nó anyway.
James

Chỉ tò mò, chương trình nào nhân đôi kích thước của mã bằng cách truyền tham số xung quanh để tránh các biến toàn cục? Theo kinh nghiệm của tôi, sử dụng các biến toàn cục có thể giải quyết các vấn đề phơi nhiễm dữ liệu, nhưng thường có thêm logic phức tạp mà bạn cần thêm vào để đảm bảo các biến ma thuật này hoạt động đúng.
dùng2167582

3
Nếu ai đó vượt qua khoảng 100 biến, thì họ đã không học được đối tượng là gì. Sử dụng tham chiếu đến đối tượng này sau đó là tồi tệ nhất đi qua một con trỏ. Tôi muốn nói rằng quy tắc không chỉ rõ ràng, nhưng khả năng kiểm tra cũng vậy - và sử dụng phi toàn cầu có xu hướng làm cho mọi thứ dễ kiểm tra hơn nhiều.
UKMonkey

2
"Nếu ai đó vượt qua khoảng 100 biến, thì họ đã không học được đối tượng là gì." Đồng ý, nhưng không phải tất cả thế giới đều hướng đối tượng. Ví dụ cá nhân của tôi về việc nhân đôi kích thước mã là một chương trình Fortran lớn, vào khoảng năm 1986. Là một nhân viên mới ra trường, tôi đã "cải thiện" nó, bằng cách thêm khoảng 30 tham số cho mỗi cuộc gọi, loại bỏ tất cả các toàn cầu. Sau đó, cởi bỏ sự cải thiện của tôi khi tôi nhận ra những gì tôi đã rèn.
Tom West

64

Giáo sư của tôi đã từng nói điều gì đó như: sử dụng các biến toàn cục là ổn nếu bạn sử dụng chúng đúng cách. Tôi không nghĩ mình đã từng sử dụng chúng một cách chính xác, vì vậy tôi hiếm khi sử dụng chúng.


25
Thật vậy. Chúng giống như gotos, nếu bạn không biết khi nào nên sử dụng chúng thì đừng bao giờ làm.
David Holm

5
Tại công ty hiện tại của tôi, họ sử dụng staticcác biến toàn cục rất nhiều, ngôn ngữ là C. Bị giới hạn trong các đơn vị dịch tương đối nhỏ, họ bắt đầu giống với các biến lớp của các đối tượng C ++.
Vorac

1
Biến tĩnh @Vorac không phải là biến toàn cục, chúng là biến cục bộ. Một biến toàn cục là một biến có sẵn ở mọi nơi trong chương trình (do đó là "toàn cầu", duh). Không được nhầm lẫn với các biến phạm vi tệp , là các biến được khai báo bên ngoài bất kỳ chức năng nào. Một biến phạm vi tệp tĩnh không phải là biến toàn cục.
Lundin

1
Để sửa mình , program lifetime, file scope variables. Và chúng trở nên khá toàn cầu khi bạn chuyển một con trỏ tới biến sang thế giới bên ngoài (điều này là không thể với các biến tự động) ..
Vorac

@Lundin Tôi đồng ý, staticBiến toàn cầu có phạm vi giới hạn trong cùng một đơn vị dịch. Nhưng họ có thời gian tồn tại cho đến khi kết thúc chương trình như bất kỳ biến toàn cầu nào.
akhilesh1988

38

Biến toàn cục chỉ nên được sử dụng khi bạn không có sự thay thế. Và vâng, bao gồm Singletons. 90% thời gian, các biến toàn cục được giới thiệu để tiết kiệm chi phí chuyển xung quanh một tham số. Và sau đó mã hóa đa luồng / kiểm tra đơn vị / bảo trì xảy ra, và bạn có một vấn đề.

Vì vậy, có, trong 90% các tình huống biến toàn cầu là xấu. Các trường hợp ngoại lệ không thể được nhìn thấy bởi bạn trong những năm đại học của bạn. Một ngoại lệ tôi có thể nghĩ ra khỏi đỉnh đầu của mình là đối phó với các đối tượng toàn cầu vốn có như các bảng ngắt. Những thứ như kết nối DB dường như là toàn cầu, nhưng không phải vậy.


2
Một ngoại lệ mà tôi thấy trong những năm đại học là các chức năng gọi lại đồ họa. Trong XWindows, các cuộc gọi lại chuột không có khoảng trống * đối số dữ liệu cho phép bạn vượt qua các khối tùy ý của trạng thái chương trình ... (không phải điều đó cuối cùng cũng tốt hơn toàn cầu ...)
Brian Postow

10
+1 cho "Những thứ như kết nối DB dường như là toàn cầu, nhưng không phải vậy."
R .. GitHub DỪNG GIÚP ICE

1
Các bảng ngắt không phải là toàn cục, mỗi bảng có một bộ xử lý - nhưng cũng có một phiên bản chương trình của bạn cho mỗi bộ xử lý để nó "hủy bỏ".
dùng253751

1
Bất cứ ai cũng có thể vui lòng cho tôi biết lý do tại sao các kết nối DB không phải là toàn cầu (và điều gì sẽ là một sự thay thế tốt)? Tôi luôn nghĩ về các kết nối là một trong những trường hợp hiếm hoi mà toàn cầu được chấp nhận.
Floella

33

Vấn đề mà các biến toàn cục tạo ra cho lập trình viên là nó mở rộng bề mặt khớp nối giữa các thành phần giữa các thành phần khác nhau đang sử dụng các biến toàn cục. Điều này có nghĩa là khi số lượng các thành phần sử dụng biến toàn cục tăng lên, độ phức tạp của các tương tác cũng có thể tăng lên. Sự ghép nối tăng này thường làm cho các khuyết tật dễ dàng xâm nhập vào hệ thống hơn khi thực hiện các thay đổi và cũng làm cho các khiếm khuyết khó chẩn đoán và sửa chữa hơn. Sự kết hợp tăng này cũng có thể làm giảm số lượng tùy chọn khả dụng khi thực hiện thay đổi và nó có thể tăng nỗ lực cần thiết cho các thay đổi vì thường người ta phải theo dõi các mô-đun khác nhau cũng đang sử dụng biến toàn cục để xác định hậu quả của thay đổi.

Mục đích của việc đóng gói , về cơ bản ngược lại với việc sử dụng các biến toàn cục, là giảm khớp nối để giúp hiểu và thay đổi nguồn dễ dàng hơn, an toàn hơn và dễ dàng kiểm tra hơn. Sử dụng thử nghiệm đơn vị sẽ dễ dàng hơn nhiều khi các biến toàn cục không được sử dụng.

Ví dụ: nếu bạn có một biến số nguyên toàn cầu đơn giản đang được sử dụng làm chỉ số liệt kê mà các thành phần khác nhau sử dụng làm máy trạng thái và sau đó bạn thực hiện thay đổi bằng cách thêm trạng thái mới cho một thành phần mới, sau đó bạn phải theo dõi tất cả các trạng thái khác các thành phần để đảm bảo rằng sự thay đổi sẽ không ảnh hưởng đến chúng. Một ví dụ về một vấn đề có thể xảy ra là nếu một switchcâu lệnh kiểm tra giá trị của biến toàn cục liệt kê với các casecâu lệnh cho từng giá trị hiện tại đang được sử dụng ở nhiều nơi và điều đó xảy ra rằng một số switchcâu lệnh không có defaulttrường hợp nào để xử lý một giá trị bất ngờ cho toàn cầu đột nhiên bạn có hành vi không xác định cho đến khi ứng dụng có liên quan.

Mặt khác, việc sử dụng vùng dữ liệu dùng chung có thể được sử dụng để chứa một tập hợp các tham số toàn cục được tham chiếu trong toàn bộ ứng dụng. Cách tiếp cận này thường được sử dụng với các ứng dụng nhúng có dấu chân bộ nhớ nhỏ.

Khi sử dụng các biến toàn cục trong các loại ứng dụng này, trách nhiệm ghi vào vùng dữ liệu được phân bổ cho một thành phần duy nhất và tất cả các thành phần khác nhìn thấy vùng đó constvà đọc từ nó, không bao giờ ghi vào nó. Thực hiện phương pháp này giới hạn các vấn đề có thể phát triển.

Một vài vấn đề từ các biến toàn cầu cần được xử lý

Khi nguồn cho một biến toàn cục như struct được sửa đổi, mọi thứ sử dụng nó phải được biên dịch lại để mọi thứ sử dụng biến đó đều biết kích thước thật và mẫu bộ nhớ của nó.

Nếu có nhiều hơn một thành phần có thể sửa đổi biến toàn cục, bạn có thể gặp sự cố với dữ liệu không nhất quán nằm trong biến toàn cục. Với một ứng dụng đa luồng, có lẽ bạn sẽ cần thêm một số loại khóa hoặc vùng quan trọng để cung cấp một cách để chỉ một luồng tại một thời điểm có thể sửa đổi biến toàn cục và khi một luồng đang sửa đổi biến, mọi thay đổi đã hoàn tất và cam kết trước khi các chủ đề khác có thể truy vấn biến hoặc sửa đổi nó.

Việc gỡ lỗi một ứng dụng đa luồng sử dụng biến toàn cục có thể khó khăn hơn. Bạn có thể chạy vào các điều kiện chủng tộc có thể tạo ra các khiếm khuyết khó tái tạo. Với một số thành phần giao tiếp thông qua một biến toàn cục, đặc biệt là trong một ứng dụng đa luồng, việc có thể biết thành phần nào đang thay đổi biến khi nào và làm thế nào nó thay đổi biến có thể rất khó hiểu.

Tên xung đột có thể là một vấn đề với việc sử dụng các biến toàn cục. Một biến cục bộ có cùng tên với một biến toàn cục có thể ẩn biến toàn cục. Bạn cũng gặp phải vấn đề quy ước đặt tên khi sử dụng ngôn ngữ lập trình C. Một cách giải quyết là phân chia hệ thống thành các hệ thống con với các biến toàn cục cho một hệ thống con cụ thể bắt đầu bằng ba chữ cái đầu tiên (xem phần này để giải quyết xung đột không gian tên trong mục tiêu C ). C ++ cung cấp các không gian tên và với C, bạn có thể giải quyết vấn đề này bằng cách tạo một cấu trúc có thể nhìn thấy toàn cầu với các thành viên là các mục dữ liệu khác nhau và các con trỏ tới dữ liệu và các hàm được cung cấp trong một tệp dưới dạng tĩnh do đó chỉ có thể được tham chiếu qua cấu trúc có thể nhìn thấy trên toàn cầu.

Trong một số trường hợp, ý định ứng dụng ban đầu được thay đổi để các biến toàn cục cung cấp trạng thái cho một luồng được sửa đổi để cho phép một số luồng trùng lặp chạy. Một ví dụ sẽ là một ứng dụng đơn giản được thiết kế cho một người dùng sử dụng các biến toàn cục cho trạng thái và sau đó yêu cầu xuất phát từ quản lý để thêm giao diện REST để cho phép các ứng dụng từ xa hoạt động như người dùng ảo. Vì vậy, bây giờ bạn bắt đầu phải nhân đôi các biến toàn cục và thông tin trạng thái của chúng để người dùng đơn lẻ cũng như từng người dùng ảo từ các ứng dụng từ xa có bộ biến toàn cục duy nhất của riêng họ.

Sử dụng C ++ namespacestructKỹ thuật cho C

Đối với ngôn ngữ lập trình C ++, lệnh namespacenày là một trợ giúp rất lớn trong việc giảm khả năng xảy ra xung đột tên. namespacecùng với classvà các từ khóa truy cập khác nhau ( private, protectedpublic) cung cấp hầu hết các công cụ cần thiết để biến Encapsulate. Tuy nhiên, ngôn ngữ lập trình C không cung cấp chỉ thị này. Bài đăng stackoverflow này, Không gian tên trong C , cung cấp một số kỹ thuật cho C.

Một kỹ thuật hữu ích là có một vùng dữ liệu lưu trú bộ nhớ duy nhất được xác định là vùng structcó khả năng hiển thị toàn cầu và trong đó structlà các con trỏ tới các biến và hàm toàn cầu khác nhau đang được hiển thị. Các định nghĩa thực tế của các biến toàn cục được đưa ra phạm vi tệp bằng cách sử dụng statictừ khóa. Nếu sau đó bạn sử dụng consttừ khóa để chỉ ra cái nào chỉ đọc, trình biên dịch có thể giúp bạn thực thi quyền truy cập chỉ đọc.

Sử dụng structkỹ thuật cũng có thể gói gọn toàn cầu để nó trở thành một loại gói hoặc thành phần xảy ra là toàn cầu. Bằng cách có một thành phần của loại này, việc quản lý các thay đổi có ảnh hưởng đến toàn cầu và chức năng sử dụng toàn cầu trở nên dễ dàng hơn.

Tuy nhiên, trong khi namespacehoặc structkỹ thuật có thể giúp quản lý xung đột tên, các vấn đề tiềm ẩn của khớp nối giữa các thành phần mà việc sử dụng toàn cầu giới thiệu đặc biệt là trong một ứng dụng đa luồng hiện đại, vẫn tồn tại.


Đây là bàn tay exaplanation tốt nhất, giải thích tất cả mọi thứ có nó. Thanh danh!
johndoevodka

Ngôn ngữ của bạn nên có một quy tắc mã để ngăn bạn sử dụng quá nhiều khớp nối lớp.
Nhà phát triển Melbourne

20

Biến toàn cầu cũng tệ như bạn tạo ra chúng, không hơn không kém.

Nếu bạn đang tạo một chương trình được đóng gói đầy đủ, bạn có thể sử dụng toàn cầu. Đó là một "tội lỗi" khi sử dụng toàn cầu, nhưng tội lỗi lập trình là triết lý tồi tệ.

Nếu bạn kiểm tra L.in. Tomb , bạn sẽ thấy một ngôn ngữ có các biến duy nhất là toàn cầu. Không thể quét được vì tất cả các thư viện không có lựa chọn nào khác ngoài sử dụng toàn cầu.

Điều đó nói rằng, nếu bạn có lựa chọn và có thể bỏ qua triết lý lập trình viên, toàn cầu sẽ không tệ đến thế.

Không phải là Gotos, nếu bạn sử dụng chúng đúng.

Vấn đề "xấu" lớn là, nếu bạn sử dụng sai, mọi người la hét, tàu đổ bộ của sao hỏa, và thế giới nổ tung .... hoặc một cái gì đó tương tự.


16
Giảm bớt các vấn đề của việc sử dụng toàn cầu cho một sinh viên bối rối không phải là một ý tưởng hay IMO.
GEOCHET

3
Triết lý thiết kế là không khách quan. Không phải trong ít nhất. Chỉ vì hầu hết các lập trình viên không thích cái gì đó, không có nghĩa là người ta không bao giờ nên nhìn vào cái gì đó. Thật dễ dàng để sử dụng chung của toàn cầu mà không có thế giới kết thúc. Hãy để anh ấy làm điều đó, đấu tranh (biết anh ấy sẽ), và tìm hiểu làm thế nào.
dùng54650

7
Giàu có là đúng. Câu trả lời này không nói lên điều gì về những gì không / không tệ (hoặc làm thế nào để sử dụng toàn cầu một cách an toàn), chỉ có điều "chúng không tệ như tất cả những điều đó. Như vậy, nó chỉ hạ thấp các vấn đề.
jalf

4
Tôi không đồng ý rằng các biến toàn cục chỉ "xấu như bạn tạo ra chúng". Tôi nghĩ một trong những vấn đề chính, đặc biệt là trong thế giới đa nhà phát triển, liên kết này, hầu hết chúng ta sống, làm việc và lập trình, là các biến toàn cầu mang lại cho ai đó ELSE cơ hội để làm cho mã của bạn trở nên tồi tệ.
gariepy

@gariepy cho đến khi biết tôi mặc dù cuộc nói chuyện là về thống kê: D ok vậy đó ... và ứng dụng của tôi chỉ có một hoặc hai biến toàn cục, đó là một trong Visual Studio, DEBUG và TRACE mà chúng ta thường không sử dụng: D
deadManN

19

Có, nhưng bạn không phải chịu chi phí cho các biến toàn cục cho đến khi bạn ngừng làm việc trong mã sử dụng biến toàn cục và bắt đầu viết một cái gì đó sử dụng mã sử dụng biến toàn cục. Nhưng chi phí vẫn còn đó.

Nói cách khác, đó là một chi phí gián tiếp dài hạn và như vậy hầu hết mọi người nghĩ rằng nó không tệ.


19

Nếu có thể, mã của bạn sẽ được xem xét chuyên sâu trong phiên tòa của Tòa án tối cao , thì bạn muốn chắc chắn tránh các biến toàn cục.

Xem bài viết này: Mã ống thở Buggy phản ánh tầm quan trọng của đánh giá nguồn

Có một số vấn đề với phong cách của mã được xác định bởi cả hai nghiên cứu. Một trong những vấn đề phong cách mà các nhà đánh giá quan tâm là việc sử dụng rộng rãi các biến toàn cầu không được bảo vệ . Đây được coi là hình thức kém vì nó làm tăng nguy cơ rằng trạng thái chương trình sẽ trở nên không nhất quán hoặc các giá trị sẽ vô tình bị sửa đổi hoặc ghi đè. Các nhà nghiên cứu cũng bày tỏ một số lo ngại về thực tế là độ chính xác thập phân không được duy trì nhất quán trong toàn bộ mã.

Man, tôi cá rằng những nhà phát triển đang ước họ đã không sử dụng các biến toàn cầu!


6
Đó là tiếng cười hay nhất tôi từng có. Một ví dụ thực tế về lý do tại sao phát triển nguồn đóng để kiếm lợi nhuận là xấu, và một ví dụ tốt về các vars toàn cầu đã sai!
Evil Spork

Những gì được thiết lập ở đây là các biến toàn cầu được xem với sự khinh miệt. Không có gì ở đây cho thấy các biến toàn cục là một vấn đề thực sự trong mã. SysTest nói rằng mặc dù mã "không được viết theo cách phù hợp với thực tiễn tốt nhất về thiết kế phần mềm thông thường", nhưng nó vẫn sẽ "tạo ra kết quả kiểm tra nhất quán". Vì vậy, không có tác hại từ toàn cầu đã thực sự được ghi nhận. Như tôi thấy, họ chỉ xác định rằng, "Chà, những nhà phát triển này không thực hành tôn giáo mã hóa giống như phần còn lại của thế giới chính thống."
LionKimbro

17

Tôi sẽ trả lời câu hỏi này bằng một câu hỏi khác: Bạn có sử dụng singeltons / Singeltons có tệ không?

Bởi vì (hầu hết tất cả) việc sử dụng singelton là một biến toàn cầu được tôn vinh.


11
Tôi chuẩn bị đăng một bình luận thông minh rằng: "Chúng chỉ tệ nếu bạn gọi chúng là toàn cầu thay vì singletons", nhưng bạn đã đánh bại tôi.
smo

Tôi vẫn đang cố gắng tìm ra những người độc thân là LOL.
GeoffreyF67

1
@Geoffrey: đây là một số giới thiệu SO tốt - stackoverflow.com/questions/11831/... và cho một số liên kết tốt: stackoverflow.com/questions/11831/...
Gavin Miller

10
Đối với bản ghi, một singleton là một biến toàn cục với tên Mẫu thiết kế (tm) (lol) được tôn vinh để làm cho âm thanh hợp pháp. Nó tệ như nhau vì tất cả những lý do tương tự.
R .. GitHub DỪNG GIÚP ICE

@GavinMiller Bạn có nói rằng nó ổn nếu bạn sử dụng đơn giản ... ooops, uyển ngữ đơn lẻ?
Juan Mendes

14

Vấn đề ít hơn là chúng xấu , và nhiều hơn là chúng nguy hiểm . Họ có những ưu và nhược điểm riêng, và có những tình huống là cách hiệu quả nhất hoặc duy nhất để đạt được một nhiệm vụ cụ thể. Tuy nhiên, chúng rất dễ bị lạm dụng, ngay cả khi bạn thực hiện các bước để luôn sử dụng chúng đúng cách.

Một vài ưu điểm:

  • Có thể được truy cập từ bất kỳ chức năng.
  • Có thể được truy cập từ nhiều chủ đề.
  • Sẽ không bao giờ đi ra khỏi phạm vi cho đến khi chương trình kết thúc.

Một vài nhược điểm:

  • Có thể được truy cập từ bất kỳ chức năng nào, mà không cần phải được kéo vào một cách rõ ràng như là một tham số và / hoặc tài liệu.
  • Không an toàn chủ đề.
  • Làm ô nhiễm không gian tên toàn cầu và có khả năng gây ra xung đột tên, trừ khi các biện pháp được thực hiện để ngăn chặn điều này.

Lưu ý, nếu bạn muốn, hai ưu điểm đầu tiên và hai nhược điểm đầu tiên tôi liệt kê là giống hệt nhau, chỉ với cách diễn đạt khác nhau. Điều này là do các tính năng của một biến toàn cục thực sự có thể hữu ích, nhưng chính các tính năng làm cho chúng hữu ích là nguồn gốc của tất cả các vấn đề của chúng.

Một vài giải pháp tiềm năng cho một số vấn đề:

  • Xem xét liệu chúng thực sự là giải pháp tốt nhất hay hiệu quả nhất cho vấn đề. Nếu có bất kỳ giải pháp tốt hơn, sử dụng thay thế.
  • Đặt chúng trong một không gian tên [C ++] hoặc struct singleton [C, C ++] với một tên duy nhất (một ví dụ điển hình sẽ là Globalshay GlobalVars), hoặc sử dụng một quy ước đặt tên chuẩn tắc dùng cho các biến toàn cục (như global_[name]hay g_module_varNameStyle(như đã đề cập bởi underscore_d trong các ý kiến )). Điều này sẽ ghi lại cả việc sử dụng chúng (bạn có thể tìm mã sử dụng các biến toàn cục bằng cách tìm kiếm không gian tên / tên cấu trúc) và giảm thiểu tác động lên không gian tên toàn cầu.
  • Đối với bất kỳ chức năng nào truy cập các biến toàn cục, hãy ghi lại rõ ràng các biến mà nó đọc và nó viết. Điều này sẽ giúp xử lý sự cố dễ dàng hơn.
  • Đặt chúng trong tệp nguồn riêng của chúng và khai báo chúng externtrong tiêu đề được liên kết, vì vậy việc sử dụng chúng có thể bị giới hạn ở các đơn vị biên dịch cần truy cập chúng. Nếu mã của bạn phụ thuộc vào rất nhiều biến toàn cục, nhưng mỗi đơn vị biên dịch chỉ cần truy cập vào một số trong số chúng, bạn có thể xem xét sắp xếp chúng thành nhiều tệp nguồn, do đó, việc giới hạn quyền truy cập của mỗi tệp vào các biến toàn cục sẽ dễ dàng hơn.
  • Thiết lập một cơ chế để khóa và mở khóa chúng, và / hoặc thiết kế mã của bạn sao cho càng ít chức năng càng cần phải sửa đổi các biến toàn cục. Đọc chúng an toàn hơn nhiều so với viết chúng, mặc dù các cuộc đua luồng vẫn có thể gây ra vấn đề trong các chương trình đa luồng.
  • Về cơ bản, giảm thiểu quyền truy cập vào chúng và tối đa hóa tính duy nhất của tên. Bạn muốn tránh xung đột tên và có càng ít chức năng càng tốt có khả năng sửa đổi bất kỳ biến nào.

Cho dù chúng tốt hay xấu phụ thuộc vào cách bạn sử dụng chúng. Phần lớn có xu hướng sử dụng chúng một cách tồi tệ, do đó sự cảnh giác chung đối với họ. Nếu được sử dụng đúng cách, chúng có thể là một lợi ích lớn; tuy nhiên, nếu được sử dụng kém, chúng có thể và sẽ quay lại cắn bạn khi nào và như thế nào bạn ít mong đợi nhất.

Một cách tốt để xem xét là bản thân chúng không xấu, nhưng chúng cho phép thiết kế xấu và có thể nhân lên các hiệu ứng của thiết kế xấu theo cấp số nhân.


Ngay cả khi bạn không có ý định sử dụng chúng, tốt hơn là nên biết cách sử dụng chúng một cách an toàn và chọn không sử dụng, hơn là không sử dụng chúng vì bạn không biết cách sử dụng chúng một cách an toàn. Nếu bạn từng thấy mình trong tình huống cần duy trì mã có sẵn dựa trên các biến toàn cục, bạn có thể gặp khó khăn nếu bạn không biết cách sử dụng chúng đúng cách.


1
+1 cho chủ nghĩa thực dụng. Một người độc thân thường chỉ cần thêm bản tóm tắt để biến cá thể & cấu trúc lại thành thành viên, và bạn kết thúc với ... các biến toàn cục, chỉ giả mạo dưới một tên khác. Tại sao phải bận tâm, ngoài việc tránh Sin of Globals về một kỹ thuật đơn thuần? Không gian tên đẹp như một rào cản, nhưng tôi tìm thấy một đơn giản g_module_varNameStylehoàn toàn dễ đọc. Để được rõ ràng, tôi không sử dụng globals nếu tôi có thể tránh nó một cách dễ dàng - từ khóa một cách dễ dàng , bởi vì kể từ khi tôi ngừng tin rằng họ phải tránh - hay đúng hơn là obfuscated - bằng mọi giá, tôi có một thời gian tốt hơn nhiều, & tôi mã là (sốc!) xa hơn
underscore_d

@underscore_d Chủ yếu chỉ là có một cách để phân biệt các biến toàn cục và biến cục bộ dễ dàng hơn và cũng giúp dễ dàng xác định các biến toàn cục khi tìm kiếm mã của bạn, với mục đích là tránh nhầm lẫn về việc một biến là toàn cục hay cục bộ / một tham số / thành viên / vv .. Một quy ước đặt tên tiêu chuẩn như của bạn cũng hoạt động tốt, miễn là nó phù hợp. Chỉnh sửa câu trả lời của tôi với ý tưởng quy ước đặt tên tiêu chuẩn, cảm ơn.
Thời gian của Justin - Phục hồi lại

1
"Đối với bất kỳ chức năng nào ... ghi lại rõ ràng các biến nào" - hãy nhớ rằng đây là mối quan hệ bắc cầu. Nếu hàm A gọi các hàm B và C, thì nó sẽ đọc và ghi các biến được viết bởi cả hai (cộng với các biến trực tiếp trong cơ thể của nó)
Caleth 14/2/18

11

Như ai đó đã nói (tôi đang diễn giải) trong một chủ đề khác "Các quy tắc như thế này không nên bị phá vỡ, cho đến khi bạn hoàn toàn hiểu hậu quả của việc đó."

Đôi khi, các biến toàn cục là cần thiết hoặc ít nhất là rất hữu ích (Làm việc với các cuộc gọi lại do hệ thống xác định chẳng hạn). Mặt khác, chúng cũng rất nguy hiểm vì tất cả những lý do bạn đã nói.

Có nhiều khía cạnh của lập trình có lẽ nên để lại cho các chuyên gia. Đôi khi bạn CẦN một con dao rất sắc. Nhưng bạn không được sử dụng nó cho đến khi bạn sẵn sàng ...


1
Tôi đồng ý, nếu bạn hiểu hậu quả, sẽ ổn khi phá vỡ các quy tắc, nhưng nếu bạn bắt mình làm điều đó thường xuyên, bạn đang làm gì đó sai
Juan Mendes

9

Các biến toàn cục nói chung là xấu, đặc biệt là nếu những người khác đang làm việc trên cùng một mã và không muốn mất 20 phút để tìm kiếm tất cả các vị trí mà biến được tham chiếu. Và việc thêm các chủ đề sửa đổi các biến mang đến một mức độ đau đầu hoàn toàn mới.

Các hằng số toàn cầu trong một không gian tên ẩn danh được sử dụng trong một đơn vị dịch thuật là tốt và có mặt khắp nơi trong các ứng dụng và thư viện chuyên nghiệp. Nhưng nếu dữ liệu có thể thay đổi và / hoặc nó phải được chia sẻ giữa nhiều TU, bạn có thể muốn gói gọn nó - nếu không phải vì mục đích thiết kế, thì vì lợi ích của bất kỳ ai gỡ lỗi hoặc làm việc với mã của bạn.


9

Sử dụng các biến toàn cục giống như quét bụi bẩn dưới tấm thảm. Đó là một cách khắc phục nhanh chóng và dễ dàng hơn rất nhiều trong thời gian ngắn hơn là lấy một chiếc chảo bụi hoặc máy hút bụi để làm sạch nó. Tuy nhiên, nếu bạn không bao giờ kết thúc việc di chuyển tấm thảm sau đó, bạn sẽ có một mớ hỗn độn bất ngờ lớn bên dưới.


ẩn dụ lười biếng không có ngữ cảnh! = answer
underscore_d

1
@underscore_d: Tôi không đồng ý. Đây là một câu hỏi thảo luận, mặc dù nó không được gắn thẻ như vậy (có thể là do tuổi của nó), và vì vậy những câu trả lời như thế này là hoàn toàn hợp lệ, và nó đưa ra một điểm giải quyết câu hỏi của OP.
gariepy

7

Biến toàn cục là xấu, nếu chúng cho phép bạn thao tác các khía cạnh của chương trình chỉ nên được sửa đổi cục bộ. Trong OOP toàn cầu thường xung đột với ý tưởng đóng gói.


7

Tôi nghĩ rằng giáo sư của bạn đang cố gắng ngăn chặn một thói quen xấu trước khi nó bắt đầu.

Các biến toàn cầu có vị trí của chúng và giống như nhiều người nói rằng việc biết sử dụng chúng ở đâu và khi nào có thể phức tạp. Vì vậy, tôi nghĩ thay vì đi sâu vào lý do tại sao, làm thế nào, khi nào và ở đâu các biến toàn cầu mà giáo sư của bạn quyết định chỉ cấm. Ai biết được, anh ta có thể cấm họ trong tương lai.


7

Tuyệt đối không. Lạm dụng chúng mặc dù ... đó là xấu.

Vô thức loại bỏ chúng vì lợi ích của nó chỉ là ... vô trí. Trừ khi bạn biết những ưu điểm và nhược điểm, tốt nhất là chỉ đạo rõ ràng và làm như bạn đã được dạy / học, nhưng không có gì sai với các biến toàn cầu. Khi bạn hiểu những ưu và khuyết điểm tốt hơn hãy đưa ra quyết định của riêng bạn.


3
-1 Có rất nhiều lý do để thận trọng chống lại các biến toàn cầu: lý do lớn nhất đối với tôi là sự phụ thuộc ẩn và toàn cầu khiến cho việc kiểm tra mã trong bất kỳ thời trang dự đoán nào trở nên vô cùng khó khăn. Trừ khi bạn không coi trọng khả năng kiểm tra mã của mình theo cách tự động, tôi sẽ đề xuất rằng các biến toàn cục sẽ không gây ra gì cho bạn ngoài nỗi đau. Và bên cạnh đó, trong một chương trình có cấu trúc tốt luôn có những lựa chọn thay thế.
jkp

1
những gì bạn đang nói là sự phát triển quá mức, sử dụng cẩn thận trạng thái toàn cầu không ngăn chặn kiểm tra tự động - thực tế hầu như tất cả các ứng dụng đều có trạng thái toàn cầu, cho dù nó được bao bọc như các trường hợp được phân bổ động của các đối tượng được đóng gói tốt hoặc dữ liệu tĩnh được phơi bày hoàn toàn không có sự khác biệt về mặt khái niệm, vẫn còn sự phụ thuộc - đó chỉ là về cách chúng được mã hóa.
jheriko

1
Chính xác. Về cơ bản, chúng không quá "xấu" vì chúng "dễ bị phá vỡ". Nếu bạn biết cách sử dụng chúng mà không phá vỡ bất cứ thứ gì, và khi nào sử dụng chúng thay vì một giải pháp thay thế, chúng có thể hữu ích. Nếu không thì ... không nhiều lắm.
Thời gian của Justin - Tái lập lại Monica

4

Biến toàn cầu là tốt trong các chương trình nhỏ, nhưng thật kinh khủng nếu được sử dụng theo cách tương tự trong các chương trình lớn.

Điều này có nghĩa là bạn có thể dễ dàng có thói quen sử dụng chúng trong khi học. Đây là những gì giáo sư của bạn đang cố gắng bảo vệ bạn khỏi.

Khi bạn có nhiều kinh nghiệm sẽ dễ học hơn khi họ ổn.


4

Không, họ không tệ chút nào. Bạn cần xem mã (máy) do trình biên dịch tạo ra để đưa ra quyết định này, đôi khi việc sử dụng cục bộ còn tệ hơn nhiều so với toàn cầu. Cũng lưu ý rằng việc đặt "tĩnh" trên một biến cục bộ về cơ bản làm cho nó trở thành toàn cầu (và tạo ra các vấn đề xấu khác mà toàn cầu thực sự sẽ giải quyết). "toàn cầu địa phương" là đặc biệt xấu.

Globals cung cấp cho bạn quyền kiểm soát sạch đối với việc sử dụng bộ nhớ của bạn, một điều khó khăn hơn nhiều đối với người dân địa phương. Những ngày này chỉ quan trọng trong môi trường nhúng, nơi bộ nhớ khá hạn chế. Một số điều cần biết trước khi bạn cho rằng nhúng giống như các môi trường khác và giả sử các quy tắc lập trình là giống nhau trên bảng.

Thật tốt khi bạn đặt câu hỏi về các quy tắc được dạy, hầu hết chúng không phải là lý do bạn được nói. Bài học quan trọng nhất không phải là đây là một quy tắc để mang theo bạn mãi mãi, nhưng đây là một quy tắc bắt buộc phải tôn vinh để vượt qua lớp học này và tiến về phía trước. Trong cuộc sống, bạn sẽ thấy rằng đối với công ty XYZ, bạn sẽ có các quy tắc lập trình khác mà cuối cùng bạn sẽ phải tôn trọng để tiếp tục nhận được một mức lương. Trong cả hai tình huống bạn có thể tranh luận về quy tắc, nhưng tôi nghĩ bạn sẽ gặp may mắn hơn trong công việc so với ở trường. Bạn chỉ là một trong số nhiều sinh viên, chỗ ngồi của bạn sẽ sớm được thay thế, các giáo sư sẽ không, trong một công việc bạn là một trong những nhóm người chơi nhỏ phải xem sản phẩm này đến cùng và trong môi trường đó các quy tắc được phát triển là dành cho lợi ích của các thành viên trong nhóm cũng như sản phẩm và công ty, Vì vậy, nếu mọi người đều có cùng suy nghĩ hoặc nếu sản phẩm cụ thể có lý do kỹ thuật tốt để vi phạm điều bạn học được ở trường đại học hoặc một số cuốn sách về lập trình chung, thì hãy bán ý tưởng của bạn cho nhóm và viết nó thành một phương pháp hợp lệ nếu không phải là phương pháp ưa thích . Tất cả mọi thứ là trò chơi công bằng trong thế giới thực.

Nếu bạn tuân theo tất cả các quy tắc lập trình được dạy cho bạn ở trường hoặc sách thì sự nghiệp lập trình của bạn sẽ vô cùng hạn chế. Bạn có thể sống sót và có một sự nghiệp hiệu quả, nhưng bề rộng và chiều rộng của môi trường dành cho bạn sẽ vô cùng hạn chế. Nếu bạn biết làm thế nào và tại sao quy tắc ở đó và có thể bảo vệ nó, điều đó tốt, nếu bạn chỉ có lý do là "bởi vì giáo viên của tôi đã nói như vậy", điều đó không tốt lắm.

Lưu ý rằng các chủ đề như thế này thường được tranh luận tại nơi làm việc và sẽ tiếp tục, vì trình biên dịch và bộ xử lý (và ngôn ngữ) phát triển nên các loại quy tắc này và không bảo vệ vị trí của bạn và có thể được dạy bởi một người có ý kiến ​​khác mà bạn sẽ không dạy tiến về phía trước.

Trong lúc này, sau đó chỉ cần làm bất cứ điều gì người nói to nhất hoặc mang cây gậy lớn nhất nói (cho đến khi bạn là người hét to nhất và mang cây gậy lớn nhất).


4
Đây có phải chỉ là một cách khác để nói "không ai từng bị sa thải vì mua IBM"?
Gordon Potter

1
Điểm hay là đối với một số ứng dụng sử dụng biến toàn cục thực sự có thể làm cho công việc dễ dàng hơn. Nói chung, việc sử dụng các biến toàn cục là một nguồn của các vấn đề với các đường dẫn ẩn của khớp nối giữa các phần của nguồn. Tuy nhiên, có một vùng bộ nhớ dùng chung được tham chiếu là toàn cục được sử dụng cho một số triển khai như giao diện thiết bị hoặc có lẽ là bảng tham số toàn cầu chứa các hằng số các loại hoặc bảng nhảy.
Richard Chambers

4

Tôi muốn tranh luận về quan điểm được đưa ra trong suốt chủ đề này rằng nó làm cho đa luồng trở nên khó hơn hoặc không thể thực hiện được. Các biến toàn cục được chia sẻ trạng thái, nhưng các lựa chọn thay thế cho toàn cầu (ví dụ: chuyển con trỏ xung quanh) cũng có thể chia sẻ trạng thái. Vấn đề với đa luồng là làm thế nào để sử dụng đúng trạng thái chia sẻ, chứ không phải là trạng thái đó có được chia sẻ thông qua một biến toàn cục hay một cái gì khác.

Hầu hết thời gian khi bạn thực hiện đa luồng, bạn cần chia sẻ một cái gì đó. Ví dụ, trong mẫu nhà sản xuất-người tiêu dùng, bạn có thể chia sẻ một số hàng đợi an toàn luồng có chứa các đơn vị công việc. Và bạn được phép chia sẻ nó vì cấu trúc dữ liệu đó là an toàn cho chuỗi. Cho dù hàng đợi đó là toàn cầu hay không hoàn toàn không liên quan khi nói đến an toàn luồng.

Hy vọng ngụ ý được thể hiện trong suốt chủ đề này rằng việc chuyển đổi một chương trình từ đơn luồng sang đa luồng sẽ dễ dàng hơn khi không sử dụng toàn cầu là ngây thơ. Vâng, toàn cầu giúp bạn dễ dàng tự bắn vào chân mình, nhưng có rất nhiều cách để tự bắn.

Tôi không ủng hộ toàn cầu, vì các điểm khác vẫn đứng vững, quan điểm của tôi chỉ là số lượng luồng trong một chương trình không liên quan gì đến phạm vi biến.


3

Có, bởi vì nếu bạn để các lập trình viên không đủ năng lực sử dụng chúng (đọc 90% đặc biệt là các nhà khoa học), bạn sẽ kết thúc với hơn 600 biến toàn cầu trải rộng trên 20 tệp và một dự án gồm 12.000 dòng trong đó 80% hàm bị mất, trả về trống và hoạt động hoàn toàn trên nhà nước toàn cầu.

Nó nhanh chóng trở nên không thể hiểu những gì đang diễn ra tại bất kỳ thời điểm nào trừ khi bạn biết toàn bộ dự án.


2

Sử dụng các biến toàn cầu thực sự phụ thuộc vào các yêu cầu. Ưu điểm của nó là, nó giảm chi phí truyền lại các giá trị nhiều lần.

Nhưng giáo sư của bạn là đúng bởi vì nó làm tăng các vấn đề bảo mật vì vậy nên tránh sử dụng các biến toàn cục càng nhiều càng tốt. Các biến toàn cục cũng tạo ra các vấn đề đôi khi khó gỡ lỗi .

Ví dụ:-

Các tình huống khi các giá trị biến đang được sửa đổi trong thời gian chạy . Tại thời điểm đó, rất khó để xác định phần nào của mã đang sửa đổi nó và với điều kiện nào.


2

Toàn cầu là tốt khi nói đến cấu hình . Khi chúng ta muốn chúng tôi cấu hình / thay đổi để có một tác động toàn cầu trên toàn bộ dự án .

Vì vậy, chúng tôi có thể thay đổi một cấu hình và các thay đổi được hướng đến toàn bộ dự án . Nhưng tôi phải cảnh báo bạn sẽ phải rất thông minh để sử dụng toàn cầu.


1

Sớm hay muộn bạn sẽ cần thay đổi cách đặt biến đó hoặc điều gì xảy ra khi nó được truy cập, hoặc bạn chỉ cần tìm ra nơi nó được thay đổi.

Thực tế luôn luôn tốt hơn để không có các biến toàn cầu. Chỉ cần viết các phương thức nhận và thiết lập đập, và nói với bạn khi bạn cần chúng một ngày, tuần hoặc tháng sau.


1

Tôi thường sử dụng toàn cầu cho các giá trị hiếm khi được thay đổi như singletons hoặc con trỏ hàm thành các hàm trong thư viện được tải động. Sử dụng các quả cầu có thể thay đổi trong các ứng dụng đa luồng có xu hướng dẫn đến lỗi khó theo dõi vì vậy tôi cố gắng tránh điều này như một quy tắc chung.

Sử dụng toàn cầu thay vì truyền đối số thường nhanh hơn nhưng nếu bạn đang viết một ứng dụng đa luồng, điều mà bạn thường làm hiện nay, thì nó thường không hoạt động tốt (bạn có thể sử dụng thống kê luồng nhưng sau đó hiệu suất đạt được là đáng ngờ) .


1

Trong các ứng dụng web trong enterprize có thể được sử dụng để lưu dữ liệu cụ thể của phiên / cửa sổ / luồng / người dùng trên máy chủ vì lý do tối ưu hóa và để bảo vệ chống mất công việc khi kết nối không ổn định. Như đã đề cập, điều kiện cuộc đua cần phải được xử lý. Chúng tôi sử dụng một ví dụ duy nhất của một lớp cho thông tin này và nó được quản lý cẩn thận.


1

Vào cuối ngày, chương trình hoặc ứng dụng của bạn vẫn có thể hoạt động nhưng vấn đề là gọn gàng và có sự hiểu biết đầy đủ về những gì đang diễn ra. Nếu bạn chia sẻ một giá trị biến trong số tất cả các hàm, có thể khó theo dõi hàm nào đang thay đổi giá trị (nếu hàm làm như vậy) và khiến việc gỡ lỗi khó hơn gấp triệu lần


0

bảo mật ít hơn có nghĩa là bất kỳ ai cũng có thể thao túng các biến nếu chúng được khai báo toàn cầu, vì điều này để giải thích lấy ví dụ này nếu bạn có số dư là biến toàn cầu trong chương trình ngân hàng của mình, chức năng người dùng có thể thao túng điều này cũng như nhân viên ngân hàng cũng có thể thao túng Điều này do đó có một vấn đề. Người dùng chỉ nên được cung cấp chức năng chỉ đọc và rút tiền nhưng nhân viên ngân hàng có thể thêm số tiền khi cá nhân người dùng đưa tiền vào bàn. Đây là cách nó hoạt động


-1

Trong một ứng dụng đa luồng, sử dụng các biến cục bộ thay cho các biến toàn cục để tránh tình trạng chủng tộc.

Một điều kiện cuộc đua xảy ra khi nhiều luồng truy cập vào một tài nguyên được chia sẻ, với ít nhất một luồng có quyền truy cập ghi vào dữ liệu. Sau đó, kết quả của chương trình là không thể dự đoán được, và phụ thuộc vào thứ tự truy cập dữ liệu theo các luồng khác nhau.

Thông tin thêm về điều này tại đây, https://software.intel.com/en-us/articles/use-intel-abul-inspector-to-find-race-conditions-in-openmp-basing-multithreaded-code


Đối với hậu thế: điều này đúng một phần là tốt nhất. "Biến cục bộ" trong câu trả lời này đề cập đến các biến chủ đề-chủ đề , thay vì các biến cục bộ phạm vi phổ biến hơn mà OP đang đề cập. Các tác dụng phụ của việc sửa đổi các biến toàn cục theo cách không an toàn luồng là rất khác với các thay đổi trạng thái toàn cầu theo cách không đồng thời.
Jules
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.